如何用SQL查询同一列值相同但另一列值不同的记录?
查询同一列值相同但另一列值不同的记录
你之前写的select Name,Type from table where Name != Name不会返回任何结果,因为一个字段不可能不等于自身,这个条件永远不成立。下面是几种能实现需求的正确SQL写法:
方法一:分组筛选+关联原表
先通过分组找出对应多种不同Type的Name,再关联原表获取完整记录:
SELECT t.Name, t.Type FROM your_table t INNER JOIN ( SELECT Name FROM your_table GROUP BY Name HAVING COUNT(DISTINCT Type) > 1 ) sub ON t.Name = sub.Name;
说明:子查询里的COUNT(DISTINCT Type)用于统计每个Name对应的不同Type数量,筛选出数量大于1的Name后,再和原表关联拿到所有相关记录。记得把your_table替换成你的实际表名。
方法二:窗口函数(适合支持窗口函数的数据库)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),可以用这种更简洁的写法:
SELECT Name, Type FROM ( SELECT Name, Type, COUNT(DISTINCT Type) OVER (PARTITION BY Name) AS type_count FROM your_table ) t WHERE type_count > 1;
说明:窗口函数PARTITION BY Name按Name分组,统计每个组内不同Type的数量,外层直接筛选数量大于1的记录即可。
方法三:自连接查询
通过表自连接的方式,找到同一个Name但Type不同的记录:
SELECT DISTINCT t1.Name, t1.Type FROM your_table t1 JOIN your_table t2 ON t1.Name = t2.Name AND t1.Type != t2.Type;
说明:自连接后会产生重复记录,所以用DISTINCT去重,确保结果里的记录唯一。
内容的提问来源于stack exchange,提问作者PaulMorton
相关产品推荐
相关产品推荐

