SQL查询:获取两单列表交集中非重复值的问题求助
嘿,这个重复配对的坑我之前刚踩过!咱们来捋清楚怎么解决你的问题:
正确查询Table A与Table B共同数值的几种方法
你的核心需求是找出Table A里所有在Table B中存在的数值,但直接关联查询会因为多对多匹配产生重复,加DISTINCT又没达到预期?咱们分情况给方案:
1. 用IN子查询(最直观好懂)
这种方式直接筛选colA的值在colB里的记录,不会出现那种无意义的重复配对:
SELECT colA FROM TableA WHERE colA IN (SELECT colB FROM TableB);
如果colA本身有重复值,这个查询会保留原表的重复次数;要是你只想要唯一的共同数值,就在SELECT后面加DISTINCT:
SELECT DISTINCT colA FROM TableA WHERE colA IN (SELECT colB FROM TableB);
2. 用EXISTS子查询(大数据量首选)
EXISTS是检查“是否存在匹配”,一旦找到符合条件的记录就停止检索,比IN在大表上的性能更好,同样不会产生多余的重复:
SELECT colA FROM TableA a WHERE EXISTS ( SELECT 1 FROM TableB b WHERE b.colB = a.colA );
同样,需要唯一值的话加DISTINCT就可以。
3. 用JOIN+DISTINCT(正确避免重复的关联写法)
你之前用关联查询出现重复,是因为直接JOIN会把A里的每个匹配值和B里的每个匹配值都配对——比如A有3个1,B有2个1,JOIN后会跑出6个1。这时候正确的做法是先关联再去重:
SELECT DISTINCT a.colA FROM TableA a INNER JOIN TableB b ON a.colA = b.colB;
这里的DISTINCT是在关联之后去重,得到的就是唯一的共同数值;如果你想保留A里原本的重复记录(只要值在B里存在),那别加DISTINCT,这时候其实用IN/EXISTS更合适。
关于你说的“加DISTINCT后结果不正确”
你提到加DISTINCT得到了错误的过滤结果,大概率是你误解了它的作用,或者需求不是取唯一值?比如如果你需要保留Table A中原本的重复次数(只要该值在B里存在),那加DISTINCT就会把这些重复去掉,自然不符合预期——这时候直接用IN或EXISTS就行,不用加DISTINCT。
总结一下:
- 要保留Table A原有重复记录:用IN或EXISTS,不加
DISTINCT - 只要唯一的共同数值:用IN+
DISTINCT、EXISTS+DISTINCT,或者JOIN+DISTINCT
内容的提问来源于stack exchange,提问作者BlueTriangles
相关产品推荐
相关产品推荐

