2009-07-11 15 views
1

Wenn Sie einen linken Join in TSQL (MSSQL SERVER) ausführen, gibt es irgendeine Garantie, welche Zeile mit Ihrer Abfrage zurückkehrt, wenn mehrere Zeilen auf der rechten Seite sind?TSQL Left Verbinden mit mehreren rechten Zeilen

Ich versuche dies zu nutzen, um eine Bestellung auf der richtigen Tabelle auszunutzen.

so

Select ColA, ColB, ColC 
from T 
Left Outer Join 
    (Select ColA, ColB, ColC 
    from T--CLARIFIED, this is a self join. 
    Order by TopColumn Desc) AS OrderedT(ColA, ColB, ColC) 
    On T.ColA = OrderedT.ColA 

Ich würde erwarten, dass alle in der Tabelle der Colas abzurufen, und alle die erste Zeile in dem Satz von ColA Ergebnisse für meine linke basiert auf meiner Bestellung JOIN.

Gibt es eine Garantie für die Sprache oder den Server?

+1

Bitte achten Sie mehr auf die Tag-Auto-Suggesse-Eingabeaufforderung. Es gibt nur 4 Fragen, die mit "mssql" und mehr als 6000 mit "sql-server" getaggt sind. In Anbetracht dessen, was halten Sie für richtig? Du warst lange genug hier, du solltest es besser wissen. –

+0

Ich absichtlich als MSSQL Server markiert, da meine Frage bezieht sich auf diesen Server, da das Verhalten dieser zwischen MSSQL-Server und Oracle-Zugang usw. unterschiedlich sein kann. – Spence

+1

Das SQL-Server-Tag bedeutet MS SQL Server. Es gibt auch separate Tags für 'oracle', 'mysql', 'ms-access' und andere Datenbank-Varianten. Nochmals: Überprüfen Sie die Eingabeaufforderungen, wenn Sie die Frage posten. Jedes Tag mit einer Zahl von weniger als 10 ist höchstwahrscheinlich _wrong_. –

Antwort

4

Ich glaube, Sie brauchen diese ...

select T.ColA, T.ColB, T.ColC 
from T 
inner join 
    (select ColA, max(TopColumn) MaxTopColumn 
    from T 
    group by ColA) OrderedTable 
    on T.ColA = OrderedTable.ColA and T.TopColumn = OrderedTable.MaxTopColumn 

Ziemlich häufig Abfrage für versioniert Tabellen erfordert eine innere zu einer max Abfrage verbinden.

Der Tabellenname "Tabelle" hilft nicht, ich habe ihn umbenannt.

+0

Wird sich nicht beschweren, dass TopColumn nicht in der Gruppe enthalten ist? Oder weil es in aggregierter Form in Ordnung ist – Spence

+0

Ist der zweite Teil der Join auch notwendig? Wäre der Beitritt zur Cola = ColA nicht ausreichend? – Spence

+0

Sie aggregieren nach den Spalten ohne Aggregat in einer Abfrage. Ich habe keinen SQL-Server zur Hand, aber ich habe diese Abfrage Dutzende Male auf MSQLServer und Sybase geschrieben und das ist die richtige Struktur. Der Nachteil ist die Aggregatabfrage ist eine Tabelle Scan (oder vollständige Index-Scan) und es gibt keine Möglichkeit, die Leistung ist nicht perfekt, aber für das, was Sie fragen, ist dies die Abfrage. –

2

Nicht so einfach. Der LINKE JOIN gibt alle passenden rechten Zeilen zurück. Die Frage nach der Garantie ist also nicht wirklich relevant. Sie müssen etwas mit einer Unterabfrage tun, um die gewünschte Zeile zu erhalten, indem Sie TOP 1 in der Unterabfrage verwenden.

+0

Aber ich kann Top 1 nicht als Aggregat verwenden. Dies dient ausschließlich dazu, das Problem zu lösen, die oberste Zeile für jede Spalte zu holen, die ich vermeiden möchte. – Spence

+0

@David M: "Das LINKE JOIN gibt alle passenden rechten Zeilen zurück" - ist das nicht falsch? –

+1

Nein. Ein LINKER JOIN gibt alle Zeilen von links und ** alle übereinstimmenden Zeilen ** von rechts zurück. –

1

Ein LINKER JOIN gibt alle linken Zeilen zurück, die alle WHERE-Kriterien erfüllen, unabhängig davon, ob auf der rechten Seite (auf den Join-Schlüsseln) eine übereinstimmende Zeile vorhanden ist. Spalten in der rechten Tabelle werden als NULL zurückgegeben, wenn keine Übereinstimmung für den Join-Schlüssel vorhanden ist.

+0

Verstanden, ich habe meine Frage dahingehend geklärt, dass es sich um ein Self-Join handelt. Daher enthält die Abfrage keine Nullwerte auf der rechten Seite. Sehr gültiger Punkt jedoch. – Spence

Verwandte Themen