2010-09-10 151 views
7

我試圖構建一個查詢,它將返回表中的所有非重複(唯一)記錄。查詢將需要使用多個字段來確定記錄是否重複。非重複記錄的SQL查詢

例如,如果一個表具有以下字段; 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,但是它返回所有記錄。

感謝您的幫助。

回答

8

HAVING COUNT(*) = 1將工作,如果您只包括GROUP BY中用於查找唯一記錄的字段。 (即不PKID,但你可以使用MAXMIN返回,既然你只有在結果集每組一個記錄。)

+0

OK,我跑的查詢再次使用COUNT = 1和它的工作!出於某種原因,當我之前運行它時,它返回了所有記錄。感謝您將它推向正確的方向。 – nth 2010-09-10 16:06:52

+0

太棒了,很高興你能工作! – heisenberg 2010-09-10 16:16:46

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

只需添加:

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

GROUP BY基團與同一AcctNo,訂購日期和充電的所有行一起, 則HAVING COUNT(1) = 1只顯示只有1個祖先的行。

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); 

以上,基於格斯的例子簡化:

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

你可以只下降了PKID返回所有記錄:

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

備註: 這與您所要求的略有不同。
它通過刪除一個非唯一字段來返回一個唯一集合。
以你爲例,你要求返回非重複。

我只能看到你的例子很有用,如果你想通過提取「良好」記錄來清理表格,那麼

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) 

內部查詢的最後一部分,您可以與「平等的標準撥弄「 - 添加所需數量的列進行測試。 當然,這得到了很多更有趣的,而不該主鍵:)在這種情況下,我通常最終會創建一個

Ketil

+0

不應該查詢讀取'>'或'<'而不是'<>'?用'<>'結果將包含* none *的重複行而不是一個副本 – crizzis 2017-06-14 17:30:20

+0

不,<>確保您不會對自己測試記錄 - 與Martin Smiths解決方案#2相同。 A < or >只會在pkid值較高或較低的pkids上查找重複項 - 不足以確保指定的數據列的唯一性。 – 2017-06-16 04:54:32

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;