看到一位同事今天运行查询,我无法解释为什么或如何失败。 查询是(抽象的):
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的组合。
修复起来很简单,但任何人都可以解释为什么会发生这种行为?
谢谢!
答案 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
子句中引用的外部查询列