为什么运行无效子查询的查询?

时间:2016-11-21 17:00:25

标签: sql sql-server

看到一位同事今天运行查询,我无法解释为什么或如何失败。 查询是(抽象的):

UPDATE table1
SET columnToUpdate = 1
WHERE recordID IN (
SELECT recordID FROM table2 WHERE table2column IN ( *list of values*))

问题是他错误地记录了recordID,它只出现在table1中,对于personID,它存在于两个表中,并且是表1中的PK,表2中的FK。

我原以为查询不会运行,因为subselect无法解析(实际上,如果你单独运行subselect,它就会失败)。 相反,运行上面的查询更新了table1中的所有记录,这些记录以前是NULL和0的组合。

修复起来很简单,但任何人都可以解释为什么会发生这种行为?

谢谢!

2 个答案:

答案 0 :(得分:3)

由于这些原因,总是别名你的表并使用字段名中的别名,否则一个简单的错误可以使SQL(正确地)将字段解释为来自除你想要的表之外的表 - 你的记录查询是Table1中的一个,如果它不在table2中

UPDATE table1 t1 
 SET t1.columnToUpdate = 1
  WHERE t1.recordID IN (
   SELECT t2.recordID FROM table2 t2 WHERE t2.table2column IN ( *list of values*))

答案 1 :(得分:2)

它被称为相关子查询。它可以帮助您在子查询

中引用外部查询列

recordID列来自子查询中的table1,而不是来自table2,这就是单独运行子查询时失败的原因。通常,当Where使用

时,您可以看到EXISTS/NOT EXISTS子句中引用的外部查询列