I progettisti del linguaggio SQL giustamente ritenuto che deve far valere sinistra a destra la precedenza di join sarebbe un vincolo inutile sulla lingua (purtroppo, non si sentivano lo stesso di colonna di ordinazione!)
ci fa sembra essere una forte preferenza per LEFT OUTER
qui su Stackoverflow, nella misura in cui folk cambierà l'intero join solo per poter usare LEFT
(ne abbiamo avuto uno here proprio ieri).
Supponiamo di aver scritto in origine nella query Table_2 INNER JOIN Table_1
prima di rendersi conto che è effettivamente necessario un join esterno che preservi tutte le righe da Table_1
. Sarebbe molto più semplice cambiare lo INNER
in RIGHT OUTER
piuttosto che cambiare l'intero join per poter usare LEFT OUTER
. Semplice è buono qui perché è meno invasivo e quindi meno il rischio che l'intento della query venga modificato inavvertitamente.
Per utilizzare un altro esempio simile, considerare l'operatore relazionale semi join; essendo parte dell'algebra relazionale, una tecnologia non può essere considerata come relazionalmente completa senza di essa. Sebbene SQL standard abbia un predicato semi join MATCH
, non è ampiamente implementato. Tuttavia, la maggior parte dei prodotti SQL supporta vari metodi. L'approccio più comune visto su Stackoverflow sembra essere quello di utilizzare INNER JOIN
con DISTINCT
nella clausola SELECT
e omettere gli attributi dalla tabella unita. Questo è seguito da vicino utilizzando WHERE table_1.ID IN (SELECT ID FROM Table_2)
. Il prossimo più popolare è WHERE EXISTS (SELECT * FROM Table_2 WHERE table_1.ID = table_1.ID)
.
Il punto è che tutti sopra sono semi-join che si trovano molto comunemente in natura. Sebbene la mia preferenza personale sia quella di usare EXISTS
(sebbene curiosamente sia quella più vicina al calcolo relazionale), devo comunque essere in grado di identificare gli altri come semi-join; È interessante notare che l'approccio più popolare (INNER JOIN
più DISTINCT
più la non proiezione) può essere il più difficile da identificare!
codice
refactoring per il solo scopo di di un raccordo stile personale è giustamente visto di buon occhio: costo di sforzi inutili, aumentano il rischio, implicazioni per il controllo di origine, ecc Imparare a riconoscere e rispettare gli altri preferenze è un'abilità importante: Se trovate te stesso refactoring una volta solo per essere in grado di capirlo ti metterà in una posizione di svantaggio.
Ovviamente, relazionalmente parlando, la risposta 'corretta' è quella di evitare integrazioni esterne del tutto. Non esiste nulla come null nel modello relazionale e i join esterni sono espressamente progettati per produrre valori nulli.
Per sommare 'a' e' b', puoi fare 'a + b' o' b + a'. Qual è il migliore? –
Penso che un moderno RDBMS possa trasformarsi l'uno con l'altro e scegliere quello che funziona meglio quindi non dovrebbe avere importanza. –