Innanzitutto, supponiamo che (id)
sia la chiave primaria della tabella. In questo caso, sì, i join sono (possono essere dimostrati) ridondanti e potrebbero essere eliminati.
Ora questa è solo teoria - o matematica. Affinché l'ottimizzatore esegua un'eliminazione effettiva, la teoria deve essere stata convertita in codice e aggiunta nella suite di ottimizzazioni / ottimizzazioni / riscritture dell'ottimizzatore. Perché ciò accada, gli sviluppatori (DBMS) devono pensare che avrà buoni benefici in termini di efficienza e che sia un caso abbastanza comune.
Personalmente, non suona come uno (abbastanza comune). La query, come ammetti, sembra piuttosto sciocca e un revisore non dovrebbe lasciarla passare, a meno che non sia stato migliorato e il join ridondante rimosso.
Detto questo, ci sono domande simili in cui avviene l'eliminazione. Esiste un post di blog correlato molto carino di Rob Farley: semplificazione JOIN in SQL Server .
Nel nostro caso, tutto ciò che dobbiamo fare per cambiare i join in LEFT
join. Vedi dbfiddle.uk . L'ottimizzatore in questo caso sa che il join può essere rimosso in modo sicuro senza modificare i risultati. (La logica di semplificazione è abbastanza generale e non è un caso speciale per i self-join.)
Ovviamente nella query originale, anche la rimozione dei INNER
join non può modificare i risultati. Ma non è affatto comune auto-unirsi sulla chiave primaria, quindi l'ottimizzatore non ha implementato questo caso. È comune tuttavia unire (o unirsi a sinistra) dove la colonna unita è la chiave primaria di una delle tabelle (e spesso c'è un vincolo di chiave esterna). Il che porta a una seconda opzione per eliminare i join: aggiungere un vincolo di chiave esterna (autoreferenziale!):
ALTER TABLE "Table"
ADD FOREIGN KEY (id) REFERENCES "Table" (id) ;
E voilà, i join vengono eliminati! (testato nello stesso violino): qui
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 file interessate
--------------------------------------------------------------------------------
-- 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 | Inserisci un batch per campo, non utilizzare "GO"
2 | I campi crescono mentre digiti
3 | Utilizzare i pulsanti [+] per aggiungere altro
4 | Vedi gli esempi di seguito per un uso avanzato
--------------------------------------------------------------------------------
-- 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 | Inserisci un batch per campo, non utilizzare "GO"
2 | I campi crescono mentre digiti
3 | Utilizzare i pulsanti [+] per aggiungere altro
4 | Vedi gli esempi di seguito per un uso avanzato
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 | Inserisci un batch per campo, non utilizzare "GO"
2 | I campi crescono mentre digiti
3 | Utilizzare i pulsanti [+] per aggiungere altro
4 | Vedi gli esempi di seguito per un uso avanzato