给定两列(Animal和Name(,如何编写SQL语句来查找没有1比1关系的行,即Dog=Patch和Dog=Rover?
动物名称 | |
---|---|
Dog | 补丁 |
Cat | Sylvester |
鼠标 | Gerry |
鼠标 | Gerry |
狗 | Rover |
这样的东西会起作用(可能不是最好的方法(:
SELECT DISTINCT Animal, Name
FROM (
SELECT Animal, Name, COUNT(DISTINCT Name) OVER (PARTITION BY Animal) NamesPerAnimal
FROM Table
UNION
SELECT Animal, Name, COUNT(DISTINCT Animal) OVER (PARTITION BY Name) AnimalsPerName
FROM Table
)
WHERE NamesPerAnimal > 1 OR AnimalsPerName > 1
这会在表中的任何位置为每个Name查找不同的Animal值的数量,反之亦然,并且只返回其中一个大于1的行。
您可以将EXISTS
运算符与相关子查询一起使用,如下所示:
SELECT Animal, Name
FROM table_name T
WHERE EXISTS(SELECT 1 FROM table_name D WHERE D.Animal=T.Animal AND D.Name<>T.Name)
ORDER BY Animal
查看演示。