Tabellenreihenfolge in Join Query

7

Wenn ich sage:

Table1 left join Table2

ist es dasselbe wie zu sagen?:

Table2 right join Table1

Mit anderen Worten, sollte ich erwarten, dass bei zwei identischen Abfragen dieselben Ergebnisse erzielt werden, bei denen nur geändert wird, welche Tabelle zuerst geschrieben wird und ob ein linker oder rechter Join verwendet wird (nach demselben Muster, das ich oben beschrieben habe?).

Juan Velez
quelle
Die Ausgabe ist dieselbe, und sogar der Abfrageplan ist identisch. (Sofern nicht überschrieben, bestimmt der Abfrageoptimierer immer die tatsächliche Verknüpfungsreihenfolge, unabhängig davon, in welcher Reihenfolge Sie die Tabellen angeben.)
Nick Chammas

Antworten:

8

Ja, die Ergebnisse sind gleich. Schauen Sie sich dies als Beispiel an:

if exists(select * from sys.tables where name = 'T1')
    drop table T1
go
if exists(select * from sys.tables where name = 'T2')
    drop table T2
go

create table T1
(
    id int not null,
    someText varchar(100) not null
)
go

insert into T1
values(1, 'hello'),
(3, 'bye'),
(6, 'what')
go

create table T2
(
    id int not null,
    someText varchar (100) not null
)
go

insert into T2
values(2, 'hi'),
(3, 'ciao'),
(4, 'no')
go

select *
from T1
left join T2
on T1.id = T2.id

select *
from T2
right join T1
on T2.id = T1.id

Die Ausgabe enthält dieselben exakten Felder (wohlgemerkt, wenn Sie SELECT *die Spaltenreihenfolge verwenden, unterscheidet sich die Reihenfolge zwischen den Abfragen) mit denselben exakten Daten.

Als Referenz sind hier die beiden Ausführungspläne:

Geben Sie hier die Bildbeschreibung ein

Thomas Stringer
quelle
1
Vielen Dank macht Sinn. Das ist die Antwort, nach der ich gesucht habe. Ich hatte heute gerade einen harten Tag mit einigen meiner Fragen.
Juan Velez