2009-04-01 6 views
2

Ich arbeite an einem SSIS-Paket, wo ich Daten aus einer CSV-Datei in eine SQL-Tabelle importieren.SELECT DISTINCT

Das einzige Feld, das mich betrifft, ist der Benutzername. Dieser Benutzername muss einmalig sein. Es ist mir egal, ob Vor- oder Nachname gleich sind oder nicht.

Im Paket habe ich die Daten aus der Datei in eine temporäre SQL-Tabelle importiert. Und dann habe ich SELECT DISTINCT verwendet, um den eindeutigen Benutzernamen auszuwählen. Und dann in die Zieltabelle einfügen.

Das Problem ist: Wenn ich einen SELECT DISTINCT Benutzername, Vorname und Nachname FROM TempUsers.

Es gibt:

  • JSmith, John, Smith
  • JSmith, Joe, Smart-
  • MBopp, Mary, Boppins

Aber ich will es zurück:

  • Schmied, John, Smith
  • MBopp, Mary, Boppins

Antwort

3

SELECT DISTINCT alle unterschiedlichen Zeilen für jede Spalte wählen Sie angeben, das ist so nicht ganz, was Sie suchen. Wenn Ihr SQL-Stil dies unterstützt, versuchen Sie GROUP BY mit FIRST(), wie folgt. Es wird der erste Datensatz für jeden einzelnen Benutzernamen zurückgegeben.

SELECT Username, FIRST(Firstname), FIRST(Lastname) 
FROM tempUsers 
GROUP BY Username 

Wenn nicht, haben Sie es auf die harte Art und Weise unter Verwendung einer Reihe ID und Sub-select zu tun:

SELECT Username, FIRST(Firstname), FIRST(Lastname) 
FROM tempUsers 
WHERE RowID IN (SELECT MIN(RowID) 
       FROM tempUsers 
       GROUP BY Username) 

** Sie sollten nicht MIN verwenden, um mit Vorname und Nachname, da können Sie ‚t Garantie wird sie aus der gleichen Reihe kommen:

SELECT Username, MIN(Firstname), MIN(Lastname) 
FROM tempUsers 
GROUP BY Username 

+0

ich mit MIN vorgeschlagen() zuerst, aber dann realisiert, dass am Ende würde den Vor- und Nachnamen kriecht. Ich bin nicht an FIRST() gewöhnt, aber ich vermute, es würde den Vor- und Nachnamen des gewählten Benutzers zusammenhalten. – yukondude

+0

Danke euch. Ich habe nicht erwartet, dass ich innerhalb von 7 Minuten eine Antwort erhalten würde. Mein Geschmack von SQL unterstützt FIRST() leider nicht ... Aber MIN() funktioniert wie ein Charme :) – tnafoo

+0

MIN() funktioniert für Ihre Teilmenge von Daten oben, weil "Joe" <"John" UND "Smart" <"Smith", aber Sie sind nicht garantiert, dass sie in allen Fällen aus der gleichen Zeile kommen. Es wird den minimalen Wert für jede Spalte * unabhängig * von innerhalb der Gruppe nehmen. –

0

Für Oracle, können Sie die folgende Abfrage verwenden:

select * from tempusers where rowid in (
select min(rowid) from tempusers group by username);