SQL Server-Join-Reihenfolge

7

Ich habe 2 Zeichenketten in der Eingabe, zum Beispiel '1,5,6' und '2,89,9' mit der gleichen Anzahl von Elementen (3 oder plus). Diese 2 Zeichen, die ich möchte, haben einen "Ordinate Join" als

gemacht %Vor%

ich habe mir gedacht, eine rownumber zuzuweisen und eine Verknüpfung zwischen 2 Resultsets als

gemacht %Vor%

ist das eine Best Practice ?

    
Luigi Saggese 16.03.2012, 12:20
quelle

3 Antworten

13

Wenn dbo.Split() den Datensatz zurückgibt, können Sie die gewünschte Zeilennummer (basierend auf ihrer Reihenfolge in der Zeichenfolge) nicht absolut sicher zuweisen. SQL never garantiert eine Reihenfolge ohne ORDER BY , die sich tatsächlich auf die Daten bezieht.

Wenn Sie Trick von (SELECT 0) verwenden, um nach Ihnen zu sortieren, können Sie oft die richtigen Werte erhalten. Wahrscheinlich sehr oft. Aber das ist nie garantiert . Gelegentlich werden Sie eine falsche Reihenfolge erhalten.

Am besten ist es, wenn Sie dbo.Split() so umschreiben, dass Sie eine Zeilennummer zuweisen, während die Zeichenfolge analysiert wird. Nur dann können Sie mit 100% Sicherheit wissen, dass die Zeilennummer wirklich der Position des Elements in der Liste entspricht.

Dann schließen Sie sich ihnen an, wie Sie vorschlagen, und erhalten Sie die gewünschten Ergebnisse.


Ansonsten scheint mir die Idee gut zu sein. Obwohl Sie vielleicht eine FULL OUTER JOIN berücksichtigen möchten, wenn eine Liste länger als die andere sein kann.

    
MatBailie 16.03.2012 12:24
quelle
7

Du kannst es auch so machen

Betrachten Sie Ihre Split-Funktion wie folgt:

%Vor%

Es wird eine einfache Aufgabe sein JOIN zusammen zu machen. So:

%Vor%

Der Vorteil ist, dass Sie kein ROW_NUMBER() OVER(ORDER BY SELECT 0)

benötigen

Bearbeiten

Wie im Kommentar ist die Performance mit einer rekursiven Split-Funktion besser. Also vielleicht so etwas:

%Vor%

Und dann ist die Auswahl wie folgt:

%Vor%     
Arion 16.03.2012 12:35
quelle
0

Danke an Arions Vorschlag. Es ist sehr nützlich für mich. Ich habe die Funktion ein wenig geändert, um den varchar (max) -Typ der Eingabezeichenfolge und die maximale Länge von 1000 für die Trennzeichenfolge zu unterstützen. Außerdem wurde ein Parameter hinzugefügt, der angibt, ob Sie die leere Zeichenfolge in der endgültigen Rückgabe benötigen.

Für die Frage von MatBailie, weil dies eine Inline-Funktion ist, können Sie die pn-Spalte in Ihre äußere Abfrage einfügen, die diese Funktion aufruft.

%Vor%

Aber ich stieß auf ein kleines Problem mit dieser Funktion, wenn die Liste, die zurückgeben soll, mehr als 100 Datensätze hatte. Also habe ich eine andere Funktion rein mit String-Parsing-Funktionen erstellt:

%Vor%

Ich hoffe, das könnte helfen.

    
Scormer 23.09.2013 18:05
quelle