2010-09-10 21 views
7

Ich versuche, eine Abfrage zu erstellen, die alle nicht doppelte (eindeutige) Datensätze in einer Tabelle zurückgibt. Die Abfrage muss mehrere Felder verwenden, um festzustellen, ob die Datensätze doppelt vorhanden sind.SQL-Abfrage für nicht doppelte Datensätze

Zum Beispiel, wenn eine Tabelle die folgenden Felder enthält; PKID, ClientID, Name, AcctNo, OrderDate, Charge, Ich möchte die Felder AcctNo, OrderDate und Charge verwenden, um eindeutige Datensätze zu finden.

Tabelle

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 

Das Ergebnis der Abfrage müssten sein:

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

I SELECT DISTINCT versucht haben, verwenden, aber das funktioniert nicht, weil es eines der doppelten hält Datensätze im Ergebnis. Ich habe auch versucht, mit HAVING COUNT = 1, aber das gibt alle Datensätze zurück.

Danke für die Hilfe.

Antwort

8

HAVING COUNT(*) = 1 funktioniert, wenn Sie nur die Felder in die GROUP BY, die Sie verwenden, um die eindeutigen Datensätze zu finden. (Dh nicht PKID, aber Sie können MAX oder MIN verwenden, die zurückkehren, da Sie nur ein Datensatz in den Ergebnissen pro Gruppe festgelegt haben werden.)

+0

OK, ich lief die Abfrage erneut am Ende der Schaffung und es funktionierte ! Aus irgendeinem Grund, als ich es vorher ausgeführt habe, gab es alle Datensätze zurück. Danke für das Anstupsen der richtigen Richtung. – nth

+0

Großartig, froh, dass es funktioniert hat! – heisenberg

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 

oder

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

einfach hinzufügen:

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

die GROUP BY Gruppen alle Zeilen mit demselben FNR, Bestelldatum und die Charge zusammen, dann ist die HAVING COUNT(1) = 1 zeigt nur die Zeilen, in denen nur 1 Progenitor vorhanden war.

1

Dank kekekela für den Schub in die richtige Richtung.

Hier ist die Abfrage, die zu dem Ergebnis ich wollte:

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

oder mehr, bezogen auf Gus Beispiel vereinfacht:

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

Sie könnten nur die PKID fallen, um alle Datensätze zurück:

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

Hinweis: Dies ist etwas anders als Sie fragen.
Es gibt eine eindeutige Menge zurück, indem das eine nicht eindeutige Feld entfernt wird.
Mit Ihrem Beispiel bitten Sie, keine Duplikate zurückzugeben.

Ich konnte nur sehen, dass Ihr Beispiel nützlich ist, wenn Sie
versuchen, eine Tabelle aufzuräumen, indem Sie die "guten" Aufzeichnungen extrahieren.

0

Sie konnten die nicht eindeutige Datensätze zuerst bestimmen, und dann für die Datensätze testen nicht in diesem Satz - wie diese

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) 

der letzte Teil der inneren Abfrage können Sie mit den Kriterien Geige für „Gleichheit "- Fügen Sie die erforderliche Anzahl der zu testenden Spalten hinzu. Verwendung von COUNT = 1 Natürlich wird dies viel interessanter, ohne dass Primärschlüssel :) In solchen Fällen in der Regel bis ich eine

Ketil

+0

Sollte die Abfrage '>' oder '<' anstelle von '<>' nicht lesen? Mit '<>' enthält das Ergebnis * none * der doppelten Zeilen anstelle nur einer Kopie – crizzis

+0

Nein, das <> stellt sicher, dass Sie keinen Datensatz gegen sich selbst testen - genau wie Martin Smiths Lösung # 2. A < or > würde nur nach Duplikaten auf PKids mit höheren oder niedrigeren PKID-Werten suchen - nicht genug, um die Eindeutigkeit der angegebenen Datenspalten zu gewährleisten. –

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; 
Verwandte Themen