Nehmen wir zunächst an, dass dies (id)
der Primärschlüssel der Tabelle ist. In diesem Fall sind die Verknüpfungen (können nachgewiesen werden) redundant und können entfernt werden.
Das ist nur Theorie - oder Mathematik. Damit der Optimierer eine tatsächliche Eliminierung durchführen kann, muss die Theorie in Code konvertiert und in die Suite der Optimierungen / Umschreibungen / Eliminierungen des Optimierers aufgenommen worden sein. Dazu müssen die (DBMS-) Entwickler davon ausgehen, dass dies gute Vorteile für die Effizienz hat und dass dies häufig genug der Fall ist.
Persönlich klingt es nicht nach einem (häufig genug). Die Abfrage sieht - wie Sie zugeben - ziemlich albern aus, und ein Prüfer sollte sie nicht bestehen lassen, es sei denn, sie wurde verbessert und der redundante Join entfernt.
Es gibt jedoch ähnliche Abfragen, bei denen die Beseitigung erfolgt. Es gibt einen sehr schönen verwandten Blog-Beitrag von Rob Farley: JOIN-Vereinfachung in SQL Server .
In unserem Fall müssen wir nur die Verknüpfungen in LEFT
Verknüpfungen ändern . Siehe dbfiddle.uk . Der Optimierer weiß in diesem Fall, dass der Join sicher entfernt werden kann, ohne die Ergebnisse zu ändern. (Die Vereinfachungslogik ist recht allgemein gehalten und nicht speziell für Self-Joins vorgesehen.)
In der ursprünglichen Abfrage kann das Entfernen der INNER
Verknüpfungen natürlich auch die Ergebnisse nicht ändern. Es ist jedoch überhaupt nicht üblich, sich auf dem Primärschlüssel selbst zu verbinden, sodass der Optimierer diesen Fall nicht implementiert hat. Es ist jedoch üblich, eine Verknüpfung (oder eine Linksverknüpfung) vorzunehmen, bei der die verknüpfte Spalte der Primärschlüssel einer der Tabellen ist (und häufig eine Fremdschlüsseleinschränkung besteht). Dies führt zu einer zweiten Option zum Entfernen der Verknüpfungen: Hinzufügen einer (selbstreferenzierenden!) Fremdschlüsseleinschränkung:
ALTER TABLE "Table"
ADD FOREIGN KEY (id) REFERENCES "Table" (id) ;
Und voila, die Verknüpfungen sind beseitigt! (in derselben Geige getestet): hier
create table docs
(id int identity primary key,
doc varchar(64)
) ;
GO
✓
insert
into docs (doc)
values ('Enter one batch per field, don''t use ''GO''')
, ('Fields grow as you type')
, ('Use the [+] buttons to add more')
, ('See examples below for advanced usage')
;
GO
4 Zeilen betroffen
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
join docs d2 on d2.id=d1.id
join docs d3 on d3.id=d1.id
join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | doc
-: | : ----------------------------------------
1 | Geben Sie einen Stapel pro Feld ein und verwenden Sie nicht 'GO'.
2 | Felder wachsen während der Eingabe
3 | Verwenden Sie die Tasten [+], um weitere hinzuzufügen
4 | In den folgenden Beispielen finden Sie Informationen zur erweiterten Verwendung
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
left join docs d2 on d2.id=d1.id
left join docs d3 on d3.id=d1.id
left join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | doc
-: | : ----------------------------------------
1 | Geben Sie einen Stapel pro Feld ein und verwenden Sie nicht 'GO'.
2 | Felder wachsen während der Eingabe
3 | Verwenden Sie die Tasten [+], um weitere hinzuzufügen
4 | In den folgenden Beispielen finden Sie Informationen zur erweiterten Verwendung
alter table docs
add foreign key (id) references docs (id) ;
GO
✓
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
join docs d2 on d2.id=d1.id
join docs d3 on d3.id=d1.id
join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | doc
-: | : ----------------------------------------
1 | Geben Sie einen Stapel pro Feld ein und verwenden Sie nicht 'GO'.
2 | Felder wachsen während der Eingabe
3 | Verwenden Sie die Tasten [+], um weitere hinzuzufügen
4 | In den folgenden Beispielen finden Sie Informationen zur erweiterten Verwendung