如何编写SQL语句找出Animal与Name列不满足1对1关系的行?
找出Animal与Name不满足1对1关系的行
要筛选出不符合1对1映射的记录,核心是识别出同一Animal对应多个不同Name,或同一Name对应多个不同Animal的分组,再提取这些分组内的所有行。
方案一:用EXISTS子查询直接筛选
SELECT t.Animal, t.Name FROM your_table t WHERE -- 匹配对应多个不同Name的Animal EXISTS ( SELECT 1 FROM your_table WHERE Animal = t.Animal GROUP BY Animal HAVING COUNT(DISTINCT Name) > 1 ) OR -- 匹配对应多个不同Animal的Name EXISTS ( SELECT 1 FROM your_table WHERE Name = t.Name GROUP BY Name HAVING COUNT(DISTINCT Animal) > 1 );
方案二:先预查异常项再关联
通过CTE先找出所有有问题的Animal和Name,再关联原表获取完整记录:
WITH problematic_animals AS ( SELECT Animal FROM your_table GROUP BY Animal HAVING COUNT(DISTINCT Name) > 1 ), problematic_names AS ( SELECT Name FROM your_table GROUP BY Name HAVING COUNT(DISTINCT Animal) > 1 ) SELECT t.Animal, t.Name FROM your_table t JOIN problematic_animals pa ON t.Animal = pa.Animal UNION SELECT t.Animal, t.Name FROM your_table t JOIN problematic_names pn ON t.Name = pn.Name;
示例数据测试结果
针对你提供的示例数据,执行上述SQL会返回以下行:
| Animal | Name |
|---|---|
| Dog | Patch |
| Dog | Rover |
注:Mouse重复关联Gerry属于1对1的正常重复,Cat仅关联唯一Name,因此不会被筛选。
内容的提问来源于stack exchange,提问作者Conor
相关产品推荐
相关产品推荐

