SQL-Abfrage, um einen einzelnen Datensatz für jeden eindeutigen Wert in einer Spalte zurückzugeben

8

Ich habe eine Tabelle in SQL Server 2000, die ich auf eine bestimmte Art abzufragen versuche. Der beste Weg, dies zu zeigen, ist mit Beispieldaten.

Siehe, [Addresses] :

%Vor%

Dies ist eigentlich ein vereinfachtes Beispiel für die Struktur der tatsächlichen Tabelle. Die Struktur des Tisches ist völlig außerhalb meiner Kontrolle. Ich brauche eine Abfrage, die eine einzelne Adresse pro Name zurückgibt. Es ist egal, welche Adresse, nur dass es nur eine gibt. Das Ergebnis könnte dies sein:

%Vor%

Ich habe eine ähnliche Frage hier , aber keine der angegebenen Lösungen funktioniert in meinem Fall, weil ich keinen Zugriff auf CROSS APPLY habe, und der Aufruf von MIN() für jede Spalte vermischt verschiedene Adressen zusammen, und obwohl es mir egal ist, welcher Datensatz zurückgegeben wird, ist es muss eine intakte Zeile sein, keine Mischung aus verschiedenen Zeilen.

Empfehlungen, um die Tabellenstruktur zu ändern, werden mir nicht helfen. Ich stimme zu, dass diese Tabelle schrecklich ist (sie ist schlimmer als hier gezeigt), aber dies ist Teil einer großen ERP-Datenbank, die ich nicht ändern kann.

Es gibt ungefähr 3000 Datensätze in dieser Tabelle. Es gibt keinen Primärschlüssel.

Irgendwelche Ideen?

    
recursive 11.06.2009, 18:52
quelle

14 Antworten

4

Nun, das wird dir ziemlich schlechte Leistung bringen, aber ich denke, es wird funktionieren

%Vor%     
Brimstedt 11.06.2009, 19:00
quelle
3

Verwenden Sie eine temporäre Tabelle oder eine Tabellenvariable und wählen Sie eine eindeutige Liste von Namen aus. Verwenden Sie diese Struktur dann, um die oberste 1 jedes Datensatzes in der ursprünglichen Tabelle für jeden eindeutigen Namen auszuwählen.

    
Gratzy 11.06.2009 19:15
quelle
3

Wenn Sie eine temporäre Tabelle verwenden können:

%Vor%

Diese Lösung wäre für viel größere Tabellen nicht ratsam.

    
Shannon Severance 11.06.2009 19:40
quelle
2
%Vor%     
tekBlues 11.06.2009 19:02
quelle
2

Wählen Sie Name, Straße, Stadt, Staat VON ( Wählen Sie Name, Straße, Stadt, Bundesland, ROW_NUMBER () OVER (PARTITION NACH Name ORDER BY Name) AS rn aus Tabelle) AS t WO rn = 1

    
A-K 11.06.2009 19:14
quelle
1

Das ist hässlich, aber es hört sich so an, als ob deine missliche Lage auch hässlich ist ... also hier geht es ...

%Vor%     
Joe Davis 11.06.2009 19:40
quelle
1

Eine temporäre Tabellenlösung wäre wie folgt

%Vor%     
Robin Day 11.06.2009 19:38
quelle
1

Ich denke, das ist ein guter Kandidat für eine Cursor-basierte Lösung. Es ist so lange her, dass ich einen Cursor benutzt habe, den ich nicht versuchen werde, das T-SQL zu schreiben, aber hier ist die Idee:

  1. Erstellen Sie eine temporäre Tabelle mit demselben Schema wie Adressen
  2. Wählen Sie verschiedene Namen in den Cursor
  3. Durchlaufen Sie den Cursor, indem Sie für jeden eindeutigen Namen die oberste 1 von Adressen in die temporäre Tabelle auswählen
  4. Zurück Auswahl aus der temporären Tabelle
Jamie Ide 11.06.2009 20:07
quelle
0

Ich glaube nicht, dass Sie das angesichts Ihrer Einschränkungen tun können. Sie können verschiedene Kombinationen dieser Felder herausziehen. Aber wenn jemand Bob und Bobb mit der gleichen Adresse buchstabiert hat, würden Sie mit zwei Platten enden. [GIGO] Sie haben Recht, dass jede Gruppierung (kurz vor der Gruppierung in allen Feldern - äquivalent zu DISTINCT) Zeilen mischt. Es ist schade, dass Sie keine eindeutige Kennung für jeden Kunden haben.

Sie können Abfragen möglicherweise so verschachteln, dass Sie die oberste 1 für jeden Namen auswählen und alle zusammen verbinden.

    
Cynthia 11.06.2009 19:14
quelle
0

Eine geringfügige Änderung am obigen sollte funktionieren.

%Vor%

Das geht jetzt nicht, wenn Sie dieselbe Straße haben, aber die anderen Informationen anders sind (z. B. mit Tippfehlern).

ODER Ein vollständiger Hash würde alle Felder enthalten (aber Sie haben wahrscheinlich zu viele für die Leistung):

%Vor%     
Orion Adrian 11.06.2009 19:11
quelle
0
%Vor%     
Paul Morgan 11.06.2009 19:25
quelle
0

Und noch ein anderer Weg:

%Vor%     
johnnycrash 11.06.2009 20:34
quelle
0
%Vor%     
Kinfo 11.06.2012 09:24
quelle
0
%Vor%     
Steve Mallory 11.06.2009 19:35
quelle

Tags und Links