如果 IN 运算符的子查询失败会怎样?
What happens if the sub-query on an IN operator fails?
我有一个 T-SQL 查询,我在其中使用 IN 运算符查找 GUID 在子查询结果中的所有记录。但是,我最近对架构进行了更改,因此 Table6 没有 GUID 字段,现在有一个 AlternateID 字段。因此,如果您 运行 IN 运算符的子查询失败。但是,如果我作为一个整体执行查询,它总是 returns TableGUIDResolving table 中的所有记录。就好像 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
都有索引,那么这应该有更好的性能。
我有一个 T-SQL 查询,我在其中使用 IN 运算符查找 GUID 在子查询结果中的所有记录。但是,我最近对架构进行了更改,因此 Table6 没有 GUID 字段,现在有一个 AlternateID 字段。因此,如果您 运行 IN 运算符的子查询失败。但是,如果我作为一个整体执行查询,它总是 returns TableGUIDResolving table 中的所有记录。就好像 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
都有索引,那么这应该有更好的性能。