如果 IN 运算符上的子查询失败,会发生什么情况?



我有一个 T-SQL 查询,我在其中使用 IN 运算符查找 GUID 位于子查询结果中的所有记录。但是,我最近对架构进行了更改,以便 Table6 没有 GUID 字段,现在有一个 AlternateID 字段。因此,如果运行 IN 运算符的子查询,它将失败。但是,如果我作为一个整体执行查询,它总是返回表GUIDResolve表中的所有记录。这几乎就像 IN 运算符为所有记录返回 TRUE,因为子查询失败。

我尝试修复子查询,当我这样做时它会按预期执行。

有人可以帮我解释一下吗?这种行为是故意的吗?

SELECT ID 
FROM TableGUIDResolving 
WHERE GUID IN (SELECT AlternateID AS GUID FROM Table1
UNION
SELECT GUID FROM Table2
UNION
SELECT GUID FROM Table3
UNION
SELECT GUID FROM Table4
UNION
SELECT GUID FROM Table5
UNION
SELECT GUID FROM Table6)

是的。 当您使用没有限定列名的子查询时,就会发生这种情况。 你认为你在说:

select table6.GUID from table6

但这并不存在,因此 SQL 中的范围规则将其更改为:

select TableGUIDResolving.GUID from table6

我建议您将逻辑更改为一系列NOT EXISTS

SELECT ID
FROM TableGUIDResolving tgr WHERE GUID IN (
WHERE EXISTS (SELECT 1 FROM Table1 t1 WHERE t1.AlternateID = tgr.GUID) OR
EXISTS (SELECT 1 FROM Table2 t2 WHERE t2.GUID = tgr.GUID) OR
EXISTS (SELECT 1 FROM Table3 t3 WHERE t3.GUID = tgr.GUID) OR
EXISTS (SELECT 1 FROM Table4 t4 WHERE t4.GUID = tgr.GUID) OR
EXISTS (SELECT 1 FROM Table4 t5 WHERE t5.GUID = tgr.GUID) OR
EXISTS (SELECT 1 FROM Table4 t6 WHERE t6.GUID = tgr.GUID) 

如果您在每个表中都有关于GUID/AlternateID的索引,那么这应该具有更好的性能。

相关内容

最新更新