非重复记录的SQL查询

时间:2010-09-10 15:58:25

标签: sql duplicates

我正在尝试构建一个将返回表中所有非重复(唯一)记录的查询。查询将需要使用多个字段来确定记录是否重复。

例如,如果表格包含以下字段; PKID,ClientID,Name,AcctNo,OrderDate,Charge,我想使用AcctNo,OrderDate和Charge字段来查找唯一记录。

PKID-----ClientID-----Name-----AcctNo-----OrderDate-----Charge
1        JX100        John     12345      9/9/2010      $100.00
2        JX220        Mark     55567      9/9/2010       $23.00
3        JX690        Matt     89899      9/9/2010      $218.00
4        JX100        John     12345      9/9/2010      $100.00

查询的结果必须是:

PKID-----ClientID-----Name-----AcctNo-----OrderDate-----Charge
2        JX220        Mark     55567      9/9/2010       $23.00
3        JX690        Matt     89899      9/9/2010      $218.00

我尝试过使用SELECT DISTINCT,但这不起作用,因为它会在结果中保留一个重复记录。我也尝试过使用HAVING COUNT = 1,但会返回所有记录。

感谢您的帮助。

7 个答案:

答案 0 :(得分:9)

如果您只在HAVING COUNT(*) = 1中包含用于查找唯一记录的字段,则

GROUP BY将起作用。 (即不是PKID,但您可以使用MAXMIN返回,因为您在结果集中每组只有一条记录。)

答案 1 :(得分:4)

SELECT   MAX(PKID)     AS PKID    ,
         MAX(ClientID) AS ClientID,
         MAX(Name)     AS Name    ,
         AcctNo                   ,
         OrderDate                ,
         Charge
FROM     T
GROUP BY AcctNo   ,
         OrderDate,
         Charge
HAVING   COUNT(*) = 1

SELECT PKID      ,
       ClientID  ,
       Name      ,
       AcctNo    ,
       OrderDate ,
       Charge
FROM   YourTable t1
WHERE  NOT EXISTS
       (SELECT *
       FROM    YourTable t2
       WHERE   t1.PKID     <> t2.PKID
       AND     t1.AcctNo    = t2.AcctNo
       AND     t1.OrderDate = t2.OrderDate
       AND     t1.Charge    = t2.Charge
       )

答案 2 :(得分:3)

只需添加:

GROUP BY AcctNo, OrderDate, Charge
HAVING COUNT(1) = 1

GROUP BY将具有相同AcctNo,OrderDate和Charge的所有行组合在一起, 那么HAVING COUNT(1) = 1只显示只有1个祖先的行。

答案 3 :(得分:1)

感谢kekekela在正确的方向上轻推。

这是产生我想要的结果的查询:

SELECT AcctNo, OrderDate, Charge FROM Table1 GROUP BY AcctNo, OrderDate, Charge
HAVING (COUNT(AcctNo) = 1) AND (COUNT(OrderDate) = 1) AND (COUNT(Charge) = 1);

或者基于Gus的例子更简化:

SELECT AcctNo, OrderDate, Charge FROM Table1 GROUP BY AcctNo, OrderDate, Charge
HAVING COUNT(1) = 1;

答案 4 :(得分:0)

您可以删除PKID以返回所有记录:

SELECT DISTINCT 
           ClientID
         , Name
         , AcctNo
         , OrderDate
         , Charge
FROM       table;

注意: 这与您提出的要求略有不同 它通过删除一个非唯一字段返回一个唯一的集合 根据您的示例,您要求返回非重复项。

如果你正在尝试,我只能看到你的例子很有用 通过提取“好”记录来清理表格。

答案 5 :(得分:0)

您可以先确定非唯一记录,然后测试那些不在该集合中的记录 - 就像这样

select * from mytable where pkid not in
(select t1.pkid 
from mytable t1 inner join mytable t2
on t1.pkid <> t2.pkid
and t1.acctno = t2.acctno
and t1.orderdate = t2.orderdate
and t1.charge = t2.charge)

内部查询的最后一部分让你摆弄&#34;平等&#34;的标准。 - 添加要测试的所需列数。 当然,没有那个主键,这会变得更有趣:)在这种情况下,我通常最终会创建一个

Ketil

答案 6 :(得分:0)

 SELECT GMPS.gen.ProductDetail.PaperType, GMPS.gen.ProductDetail.Size FROM
 GMPS.gen.ProductDetail GROUP BY GMPS.gen.ProductDetail.PaperType,
 GMPS.gen.ProductDetail.Size
 HAVING COUNT(1) = 1;