sql-server - 为什么 SQL Server 没有捕捉到这一点?子查询中的拼写错误导致意外删除
问题描述
我有一个带有子选择的查询,其中我输入了错误的列(子选择中的 id1)。如果单独执行查询,SQL Server 会抛出一个错误,这是正确的和预期的。但是,如果在以下上下文中作为子查询执行,则不会捕获错字 - 在这种情况下,我的表被清除。这是故意的行为吗?
CREATE TABLE #a1 (id1 INT);
CREATE TABLE #a2 (id2 INT);
INSERT INTO #a1 (id1) VALUES (1), (2), (3);
INSERT INTO #a2 (id2) VALUES (1);
DELETE FROM #a1 WHERE id1 = (SELECT id1 FROM #a2 WHERE id2 = 1);
SELECT * FROM #a1 -- wow, the table is now empty
我预计会抛出一个错误,而不是删除查询被解释为
DELETE FROM #a1 WHERE id1 = id1.
解决方案
外部查询中声明的表中的列在内部查询中可用。这与构建相关子查询时发挥作用的逻辑相同。
所以在这种情况下:
WHERE id1 = (SELECT id1 FROM #a2 WHERE id2=1)
子查询返回与 table 中一样多的记录#a2
,id1
来自外部查询。只要有#a2
满足条件的唯一记录,id2 = 1
其实就相当于WHERE id1 = id1
。
如果你在列名前加上表别名,你会收到一个错误:
DELETE FROM #a1 t1 WHERE t1.id1 = (SELECT t2.id1 FROM #a2 t2 WHERE t2.id2 = 1);
推荐阅读
- jmeter - JMETER Beanshell 读取文件 - 不工作 - 找不到错误命令:newBufferedReader(java.io.FileReader)
- reactjs - 什么是 React 应用程序的运行时环境以及什么是 React 应用程序中的请求-响应流程
- laravel - 无法创建根目录 - 用 laravel 大摇大摆
- c++ - 为什么我的代码在运行时停留在循环中
- java - Springboot-Prometheus:仅当来自特定来源时才增加 http_server_requests_seconds_count 计数器
- python - python中两个数据框的笛卡尔积
- javascript - 如何从解析的 JSON 数据中获取特定值?
- python-3.x - 如何一次性获取字典中最里面的值?
- unit-testing - Vertx Junit5 并发超时异常
- java - 如何将通知计数设置为 0 android firebase