在最后一条查询语句中,我引用了destViewController.fullImage.image = self.itemImg.image
中不存在的列,并且SQL Server不验证该错误,执行后,我得到了Table2
中存在的所有列,而没有任何行。
我认为这是错误的,因为返回值使我们知道Table1
查询没有发现任何行而是抛出错误。
您能解释一下为什么SQL Server具有这种行为吗?
写在SQL Server 2014,SSMS 2016中。
WHERE
答案 0 :(得分:3)
外部查询中的列在内部查询中可见。因此,实际上,对于表1中的每一行,您从表2中选择了该行的FirstName
作为常量,为表2的每一行返回相同的值。由于一个值显然在自身列表中多次存在,因此不会返回任何行。
避免此类错误的一种方法是完全限定查询的列。如果这样做,将会得到您期望的错误:
SELECT *
FROM
Table1 t1
WHERE
t1.FirstName NOT IN
(
-- Produces an error, since there's no FirstName in Table2
SELECT t2.FirstName FROM Table2 t2
)