选择SQl,其中除了一列之外,许多事物可以相等

时间:2014-04-24 20:36:42

标签: sql count firebird difference

select * from cards 
where name=name and streetname=streetname and streetnumber<>streetnumber

这是我在脑海中尝试过但却无济于事的原因

我正在尝试的是我只希望显示

当街道号码不同时。

所以例如

    Rene ter Horst : AvanueRoad : 11
    Rene ter Horst : AvanueRoad : 23
    Rene ter Horst : AvanueRoad : 11
    Rene ter Horst : AvanueRoad : 17
    Rene ter Horst : AvanueRoad : 11
    Rene ter Horst : AvanueRoad : 11

    Anna ter Horst : AvanueRoad : 11
    Anna ter Horst : AvanueRoad : 11
    Anna ter Horst : AvanueRoad : 11
    Anna ter Horst : AvanueRoad : 11

    John ter Horst : AvanueRoad : 11

但我有超过40,000件要检查的东西,所以我看不出手册

所以我想我需要实现一些计数

我只想让Rene ter Horst回归,因为它有差异

但我不想让Anna或John返回以及其他所有拥有相同姓名,地址和门牌号码的人

感谢任何帮助和术语*

我想强调一下,如果我不清楚,我无法搜索任何具体的数据库,必须弄清楚它的名字是Rene的6倍和AvanueRoad的6倍,并且它没有相同门牌号的6倍。对不起,如果我的问题听起来很模糊

3 个答案:

答案 0 :(得分:3)

使用聚合而不仅仅是选择来考虑这一点。 having子句应该进行所需的过滤:

select name
from cards
group by name
having min(streetname) <> max(streetname) or
       min(streetnumber) <> max(streetnumber);

您的数据没有任何NULL值。如果确实如此,并且您希望将它们视为不同的值,则逻辑需要更复杂一些:

select name
from cards
group by name
having min(streetname) <> max(streetname) or count(*) <> count(streetname) or
       min(streetnumber) <> max(streetnumber) or count(*) <> count(streetnumber);

答案 1 :(得分:0)

最好的方式可能是Gordon建议的GROUP BY,但这是另一种方法:

SELECT DISTINCT Name FROM cards c
WHERE EXISTS
    (SELECT * FROM cards
     WHERE c.Name = Name
     AND c.HouseNumber != HouseNumber);

答案 2 :(得分:-2)

使用SQL Unique修饰符:

SELECT DISTINCT `streetnumber` FROM `cards`