如何查询同一数据表中存在于所有Phone列的Phone1字段值?
解决方案:找出同时存在于Phone2和Phone3列中的Phone1值
嘿,我来帮你搞定这个SQL查询问题!你需要筛选出那些同时出现在Phone2和Phone3列中的Phone1字段值,也就是这个Phone1的值必须在Phone2集合里有匹配,同时在Phone3集合里也有匹配。先把你的原始数据表贴出来方便参考:
Phone1 Phone2 Phone3 123458 25689 8969860 25966 25966 123458 Null 123458 25966
核心思路
我们需要满足三个关键条件:
- Phone1的值不能是
Null(因为SQL中Null和任何值比较都返回未知,无法匹配) - Phone1的值必须存在于Phone2列的非Null值集合中
- Phone1的值必须存在于Phone3列的非Null值集合中
下面给你几种实用的实现方式:
方法1:使用IN子查询(直观易懂)
这种写法逻辑清晰,适合小型数据集:
SELECT DISTINCT Phone1 FROM phones WHERE Phone1 IS NOT NULL AND Phone1 IN (SELECT Phone2 FROM phones WHERE Phone2 IS NOT NULL) AND Phone1 IN (SELECT Phone3 FROM phones WHERE Phone3 IS NOT NULL);
DISTINCT用来避免重复的结果行- 先排除Phone1本身为
Null的情况,再检查它是否同时存在于Phone2和Phone3的有效值集合里
方法2:使用EXISTS子查询(性能更优)
如果你的数据表数据量较大,EXISTS会比IN更高效,因为它找到匹配行后就停止搜索:
SELECT DISTINCT p1.Phone1 FROM phones p1 WHERE p1.Phone1 IS NOT NULL AND EXISTS (SELECT 1 FROM phones p2 WHERE p2.Phone2 = p1.Phone1) AND EXISTS (SELECT 1 FROM phones p3 WHERE p3.Phone3 = p1.Phone1);
方法3:使用JOIN连接(适合复杂扩展场景)
如果后续需要添加更多列的匹配条件,JOIN的方式扩展性更好:
SELECT DISTINCT p.Phone1 FROM phones p JOIN (SELECT DISTINCT Phone2 FROM phones WHERE Phone2 IS NOT NULL) p2 ON p.Phone1 = p2.Phone2 JOIN (SELECT DISTINCT Phone3 FROM phones WHERE Phone3 IS NOT NULL) p3 ON p.Phone1 = p3.Phone3 WHERE p.Phone1 IS NOT NULL;
- 先分别提取Phone2和Phone3的非Null唯一值集合,再通过内连接筛选出同时匹配的Phone1值
结果验证
根据你的测试数据,以上三种方法都会返回:
Phone1 123458 25966
完全符合你“获取在所有Phone列中均存在的Phone1值”的需求。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

