sql-server - 试图理解 - 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 对于第一个运行良好,但对于第二个运行良好。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')
推荐阅读
- pandas - 具有多个类别的箱线图和小提琴图
- c# - WCF 数据服务显示未处理异常的错误
- amazon-web-services - 为什么会提示“我们计算的请求签名与您提供的签名不匹配”。对于 GET 但不是 PUT 对于 OpenSearch?
- javascript - 具有和不具有代理支持的不同代码的 Npm 模块
- discord.py - Discord.py - AttributeError: 'NoneType' 对象没有属性 'connect'
- java - 带有 CDATA 的 VDT xml 解析器 getContentFragment
- ios - 理解转义闭包 Swift
- javascript - 使用 Gmail Oauth 仅限制特定电子邮件登录
- javascript - Prisma:如何从生成的类型中排除属性
- sql - 为什么这个子查询在 Snowflake 中不起作用?