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

Formato di join SQL:inner join nidificati

Per leggibilità, ho ristrutturato la query... iniziando con l'apparente livello più alto che è Table1, che quindi si collega a Table3 e quindi table3 si lega a table2. Molto più facile da seguire se segui la catena delle relazioni.

Ora, per rispondere alla tua domanda. Stai ottenendo un conteggio elevato come risultato di un prodotto cartesiano. Per ogni record in Table1 che corrisponde a Table3 avrai X * Y. Quindi, per ogni corrispondenza tra table3 e Table2 avrà lo stesso impatto... Y * Z... Quindi il tuo risultato per un solo possibile ID nella tabella 1 può avere record X * Y * Z.

Questo si basa sul non sapere come è la normalizzazione o il contenuto per le tue tabelle... se la chiave è una chiave PRIMARIA o meno..

Ex:
Table 1       
DiffKey    Other Val
1          X
1          Y
1          Z

Table 3
DiffKey   Key    Key2  Tbl3 Other
1         2      6     V
1         2      6     X
1         2      6     Y
1         2      6     Z

Table 2
Key    Key2   Other Val
2      6      a
2      6      b
2      6      c
2      6      d
2      6      e

Quindi, la tabella 1 che si unisce alla tabella 3 risulterà (in questo scenario) con 12 record (ciascuno in 1 unito con ciascuno in 3). Quindi, ancora una volta ogni record corrispondente nella tabella 2 (5 record)... verrebbe restituito un totale di 60 ( 3 tbl1 * 4 tbl3 * 5 tbl2 ).

Quindi, ora, prendilo ed espandilo in base alle tue migliaia di record e vedrai come una struttura incasinata potrebbe soffocare una mucca (per così dire) e uccidere le prestazioni.

SELECT
      COUNT(*)
   FROM
      Table1 
         INNER JOIN Table3
            ON Table1.DifferentKey = Table3.DifferentKey
            INNER JOIN Table2
               ON Table3.Key =Table2.Key
               AND Table3.Key2 = Table2.Key2