SQL查询需求:找出ID相同但名称不同的所有数据行
嘿,这问题我熟!要找出所有ID相同但对应name不一样的数据行,咱们可以用几种不同的SQL写法来实现,下面给你详细拆解:
解决方案:检索ID相同但name不同的行
核心思路是先定位那些关联了多个不同name值的ID,再从原表中取出这些ID对应的所有行。
方法1:子查询筛选目标ID(最直观的写法)
SELECT t.* FROM your_table t WHERE t.ID IN ( SELECT ID FROM your_table GROUP BY ID -- 筛选出存在至少2个不同name的ID HAVING COUNT(DISTINCT name) > 1 );
为啥这么写?
- 内层子查询通过
GROUP BY ID把数据按ID分组,COUNT(DISTINCT name)会统计每个ID下不同name的数量,只要数量大于1,就说明这个ID有不同的name对应。 - 外层查询直接用这些ID去匹配原表,就能拿到所有符合条件的行。
方法2:自连接实现(适合对性能敏感的场景)
如果你的数据集很大,担心子查询性能,试试自连接的方式:
SELECT DISTINCT t1.* FROM your_table t1 JOIN your_table t2 ON t1.ID = t2.ID AND t1.name != t2.name;
逻辑说明:
- 把表和自己做连接,匹配条件是ID相同但name不同,这样能找出所有存在“同ID不同名”配对的行。
- 加
DISTINCT是为了避免同一行被多次重复返回(比如Diana和Daniel配对时,Diana会被查一次,Daniel和Diana配对时又会被查一次)。
用你的测试数据验证结果
你的测试数据是:
ID | name
45 | Alex
98 | Diana
32 | Peter
98 | Daniel
45 | Alex
23 | Bob
98 | Jake
执行上面的查询后,会得到以下结果:
ID | name 98 | Diana 98 | Daniel 98 | Jake
因为只有ID=98对应了多个不同的name,其他ID的name都是唯一的,所以不会被筛选出来。
内容的提问来源于stack exchange,提问作者neznajut
相关产品推荐
相关产品推荐

