我正在尝试构建一个将返回表中所有非重复(唯一)记录的查询。查询将需要使用多个字段来确定记录是否重复。
例如,如果表格包含以下字段; 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,但会返回所有记录。
感谢您的帮助。
答案 0 :(得分:9)
HAVING COUNT(*) = 1
中包含用于查找唯一记录的字段,则 GROUP BY
将起作用。 (即不是PKID
,但您可以使用MAX
或MIN
返回,因为您在结果集中每组只有一条记录。)
答案 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;