Quando il set di risultati non è importante dovrebbero essere usati Join sinistro o Join interno

1

Quando hai una query in cui stai partecipando da una chiave esterna non nulla alla tabella esterna, non importa se usi LEFT JOIN o INNER JOIN dal punto di vista del risultato (poiché non ci sarà in tutti i casi in cui non corrisponde a qualcosa sulla destra). In un caso come questo che dovrebbe essere preferito, INNER JOIN o LEFT JOIN . Mi piacerebbe prendere in considerazione le prestazioni e lo stile / documentazione.

Per me INNER JOIN è più vicino a quello che vuoi, poiché la caratteristica speciale di LEFT JOIN non si verifica, ma in molti punti vedo LEFT JOIN solo come predefinito, a meno che INNER JOIN non sia esplicitamente necessario quindi sono parzialmente preoccupato che possa far sì che le persone raddoppino a pensare qualcosa che non ha bisogno di pensare.

es. quale dei seguenti dovrebbe essere preferito

FROM dbo.Post p
LEFT JOIN dbo.User u ON p.UserID = u.UserID

o

FROM dbo.Post p
INNER JOIN dbo.User u ON p.UserID = u.UserID

supponendo che UserID sia una chiave esterna per la tabella utente e nessun post può essere creato senza un utente

    
posta mirhagk 25.05.2015 - 18:35
fonte

1 risposta

3

Ho avuto questa situazione esatta con un collaboratore e durante la revisione del codice da parte degli appaltatori - il codice dovrebbe sempre trasmettere il tuo intento e le tue aspettative nel modo più chiaro possibile, dati i limiti di prestazioni e dimensioni.

Le prestazioni con SQL si basano su Query Optimizer - mentre probabilmente non farà alcuna differenza, se lo fa, più probabilmente che no, usando un join di sinistra la performance di HURT non migliorerà; in effetti stai mentendo all'ottimizzatore.

Devo ancora incontrare un argomento convincente per codice fuorviante diverso da "era necessario per farlo funzionare".

In breve, non usare mai un join sinistro dove intendi l'inner join.

Non fa parte della tua domanda, ma dallo stesso experince - non usa mai il primo 1 "nel caso in cui venga restituita più di una riga" per una sotto-query. Nel migliore dei casi, nascondi le tue aspettative, nel peggiore dei casi restituisci risultati non corretti in modo semi-casuale.

    
risposta data 25.05.2015 - 19:46
fonte

Leggi altre domande sui tag