查询T1中C1和C2值均存在于T2的C3的记录:SQL可行性及替代方案
问题解答
给定SQL的可行性
你编写的这段SQL完全可行,逻辑完全符合需求:通过两个IN子查询分别验证T1的C1、C2值都存在于T2的C3列中,最终筛选出同时满足两个条件的T1记录。
替代方案
1. 使用EXISTS子查询
在多数数据库中,EXISTS的性能表现优于IN(尤其是T2数据量较大时),因为EXISTS找到匹配项后会立即终止当前行的检索,无需遍历整个子查询结果:
SELECT * FROM T1 WHERE EXISTS (SELECT 1 FROM T2 WHERE T2.C3 = T1.C1) AND EXISTS (SELECT 1 FROM T2 WHERE T2.C3 = T1.C2)
2. 使用JOIN关联
通过两次关联T2表分别匹配C1和C2,需注意添加DISTINCT避免重复结果(当T2存在多个匹配值时会产生重复行):
SELECT DISTINCT T1.* FROM T1 JOIN T2 ON T1.C1 = T2.C3 JOIN T2 AS T2_dup ON T1.C2 = T2_dup.C3
3. 行值匹配(部分数据库支持)
如果你的数据库支持行值构造器(如PostgreSQL、Oracle、MySQL 8.0+),可以用更简洁的写法:
SELECT * FROM T1 WHERE (C1, C2) IN (SELECT C3, C3 FROM T2)
这种写法直接判断(C1,C2)是否属于T2.C3的笛卡尔积组合,逻辑直观,但兼容性不如前两种方案。
内容的提问来源于stack exchange,提问作者Mukul Varshney
相关产品推荐
相关产品推荐

