2017-03-14 9 views
0

Ich hatte eine Mitarbeiterin, die liebte, was sie als "Komma Join" bezeichnet. Ich habe vor kurzem das Cross-Apply-Verfahren zum ersten Mal in einer Live-Umgebung angewendet und festgestellt, dass es das gleiche Ergebnis wie ihre "Komma-Join" gab und sich fragte, ob es etwas anderes an den beiden gab oder ob ihre Art nur kurz war. Unten habe ich einen Code, der zwei temporäre Tabellen erstellt und dann ein Kreuz anwendet, um alles in der ersten temporären Tabelle an alles in der zweiten anzuhängen. Es tut dies auch mit ihrem "Komma beitreten".Cross Apply vs "comma Join"

Select 
    'a' as a,'b' as b,'c' as c,'d' as d 
Into #letter 


Create table #name 
(name varchar(10)) 

Insert Into #Name 
Values('David'),('Kai'),('Brad'),('Todd'),('Vivian') 



Select * 
From #Name 
Cross apply(Select * from #letter) as A 

Select * 
    From #name 
    ,#letter 

So sind diese die gleiche nur unterschiedliche Weise, es zu schreiben oder tut es etwas anderes in einigen Fällen? Oh, wir verwenden SQL 2012.

+3

der "Komma-Join" ist der Old-Style-Join. [Schlechte Angewohnheiten zu kicken: Verwenden von alten JOINs - Aaron Bertrand] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) – SqlZim

+0

Vielen Dank für die Erklärung –

Antwort

3

Diese "Komma Joins" sind, wie SqlZim darauf hingewiesen, eine alte Art der Verknüpfung von Tabellen namens implizite Join.
Die Join-Bedingung für diese Art von Join ist in den where-Klausel - zum Beispiel -

SELECT * 
FROM a, b 
WHERE a.Id = b.aId 

die gleichen wie

SELECT * 
FROM a 
INNER JOIN b ON a.Id = b.aId 

Für das, was ich hoffe, sind offensichtliche Gründe, impliziter (oder alter Stil) Joins sind verpönt - wie Sie sich leicht vorstellen können, wenn Sie mehr als zwei Tabellen beitreten müssen, wird es im Vergleich zu expliziten Joins sehr unlesbar.

Cross apply ist jedoch keine Verbindung überhaupt. Was bedeutet Cross apply bedeutet, dass Sie ausführen, was auch immer auf der rechten Seite der cross apply Operator für jede Zeile auf der linken Seite ist.

Eine genauere explizite Join für die implizite Join-Anweisung Sie würde

SELECT * 
FROM #name 
CROSS JOIN #letter 

Eine andere Option wäre, eine innere sein geschrieben verbinden mit einem Join-Bedingung, die immer zu true bewerten wird - wie folgt aus:

SELECT * 
FROM #name 
INNER JOIN #letter ON 1=1 
+1

@TT Danke für Ihre Bearbeitung –