Ebbene, lo standard ANSI092 include una sintassi piuttosto atroce. I natural join sono uno e la clausola USING è un altro. IMHO, l'aggiunta di una colonna a una tabella non dovrebbe rompere il codice ma un NATURAL JOIN si rompe in modo eclatante. Il modo "migliore" per rompere è per errore di compilazione. Ad esempio, se SELEZIONA * da qualche parte, l'aggiunta di una colonna potrebbenon riescono a compilare. Il modo migliore per fallire sarebbe un errore di runtime. È peggio perché i tuoi utenti potrebbero vederlo, ma ti dà comunque un bel avvertimento che hai rotto qualcosa. Se si utilizza ANSI92 e si scrivono query con join NATURALI, non si interromperà in fase di compilazione e non si interromperà in fase di esecuzione, la query inizierà improvvisamente a produrre risultati errati. Questi tipi di bug sono insidiosi. I rapporti vanno male, le informazioni potenzialmente finanziarie non sono corrette.
Per chi non ha familiarità con i giunti NATURALI. Uniscono due tabelle su ogni nome di colonna presente in entrambe le tabelle. Il che è davvero interessante quando hai un tasto a 4 colonne e sei stufo di digitarlo. Il problema si presenta quando Table1 ha una colonna preesistente denominata DESCRIPTION e aggiungi una nuova colonna a Table2 denominata, oh non lo so, qualcosa di innocuo come, mmm, DESCRIPTION e ora stai unendo le due tabelle su un VARCHAR2 (1000) campo che è in forma libera.
La clausola USING può portare a un'ambiguità totale oltre al problema descritto sopra. In un altro post SO , qualcuno ha mostrato questo SQL ANSI-92 e ha chiesto aiuto per leggerlo.
SELECT c.*
FROM companies AS c
JOIN users AS u USING(companyid)
JOIN jobs AS j USING(userid)
JOIN useraccounts AS us USING(userid)
WHERE j.jobid = 123
Questo è completamente ambiguo. Ho inserito una colonna UserID in entrambe le tabelle Società e utente e non ci sono lamentele. Cosa succede se la colonna UserID nelle aziende è l'ID dell'ultima persona che ha modificato quella riga?
Dico sul serio, qualcuno può spiegare perché fosse necessaria tale ambiguità? Perché è integrato direttamente nello standard?
Penso che Bill abbia ragione sul fatto che c'è una vasta base di sviluppatori che copia / incolla lì attraverso la codifica. In effetti, posso ammettere di essere gentile quando si tratta di ANSI-92. Ogni esempio che ho visto mostrava più join nidificati tra parentesi. Onestà, questo rende difficile scegliere i tavoli in sql nel migliore dei casi. Ma poi un evangilista SQL92 ha spiegato che avrebbe effettivamente forzato un ordine di join. GESÙ ... tutti quei Copy Paster che ho visto ora stanno effettivamente forzando un ordine di iscrizione - un lavoro che il 95% delle volte è meglio lasciare agli ottimizzatori, specialmente un copy / paster.
Tomalak ha capito bene quando ha detto,
le persone non passano alla nuova sintassi solo perché esiste
Deve darmi qualcosa e non vedo un lato positivo. E se c'è un lato positivo, gli aspetti negativi sono un albatro troppo grande per essere ignorato.