Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Le query ANSI JOIN e non ANSI JOIN funzioneranno in modo diverso?

Le due query sono le stesse, tranne che la seconda è la sintassi SQL ANSI-92 e la prima è la precedente sintassi SQL che non incorporava la clausola di join. Dovrebbero produrre esattamente lo stesso piano di query interno, anche se potresti voler controllare.

Dovresti usare la sintassi ANSI-92 per diversi motivi

  • L'uso della clausola JOIN separa la logica di relazione dalla logica del filtro (il WHERE) ed è quindi più pulito e di facile comprensione.
  • Non ha importanza con questa particolare query, ma ci sono alcune circostanze in cui la vecchia sintassi di outer join (usando + ) è ambigua e i risultati della query dipendono quindi dall'implementazione o la query non può essere risolta affatto. Questi non si verificano con ANSI-92
  • È una buona pratica poiché la maggior parte degli sviluppatori e dei dba utilizzerà ANSI-92 al giorno d'oggi e dovresti seguire lo standard. Sicuramente tutti i moderni strumenti di query genereranno ANSI-92.
  • Come sottolineato da @gbn, tende ad evitare incroci incrociati accidentali.

Io stesso ho resistito all'ANSI-92 per un po' di tempo poiché c'è un leggero vantaggio concettuale nella vecchia sintassi in quanto è più facile concepire l'SQL come un join cartesiano di massa di tutte le tabelle utilizzate seguito da un'operazione di filtraggio - una tecnica mentale che può essere utile per capire cosa sta facendo una query SQL. Tuttavia, alcuni anni fa ho deciso che dovevo essere al passo con i tempi e dopo un periodo di adattamento relativamente breve ora lo preferisco fortemente, principalmente a causa del primo motivo sopra indicato. L'unico punto in cui si dovrebbe discostarsi dalla sintassi ANSI-92, o meglio non utilizzare l'opzione, è con i join naturali che sono implicitamente pericolosi.