首页 > 解决方案 > 试图理解 - IN(带有 UNION 的子查询)

问题描述

我试图理解为什么查询 1 有效,但查询 2 无效。UNION 如何影响执行?

我知道发生了隐式转换。我不是在寻求修复、最佳实践或性能,只是想了解其中的原因。

DECLARE @T1 TABLE (ID INT, TXT VARCHAR(10))
DECLARE @T2 TABLE (ID INT, T2Fk INT)

INSERT INTO @T1 VALUES(1, '1'), (2, '2'), (3, '3'), (4, 'AAA')
INSERT INTO @T2 VALUES(1, 1), (2, 3)
                    
-- Query 1
SELECT * FROM @T2 WHERE T2Fk IN (SELECT TXT FROM @T1 WHERE ID IN (1,2,3))
-- Query 2
SELECT * FROM @T2 WHERE T2Fk IN (SELECT TXT FROM @T1 WHERE ID IN (1,2) UNION SELECT '3')

谢谢

标签: sql-servertsqlsubqueryunion

解决方案


我不知道为什么 SQL 对于第一个运行良好,但对于第二个运行良好。SQL 正在将您的 T2FK 从 VARCHAR(10) 转换为 INT,这导致第二个查询失败。最佳做法是比较相同类型的值。如果您将 T2Fk 转换为 VARCHAR(10) 您的第二个查询也有效。

-- Query 2
SELECT * FROM @T2 WHERE CAST(T2Fk AS VARCHAR(10)) IN (SELECT TXT FROM @T1 WHERE ID IN (1,2) UNION SELECT '3')

推荐阅读