Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Formato de junção SQL - junções internas aninhadas


Para facilitar a leitura, reestruturei a consulta... começando com o nível mais alto aparente sendo Table1, que se vincula a Table3 e, em seguida, table3 vincula a table2. Muito mais fácil de seguir se você seguir a cadeia de relacionamentos.

Agora respondendo à sua questão. Você está obtendo uma grande contagem como resultado de um produto cartesiano. Para cada registro na Tabela1 que corresponder na Tabela3 você terá X * Y. Então, para cada correspondência entre a tabela3 e a Tabela2 terá o mesmo impacto... Y * Z... Então seu resultado para apenas um ID possível na tabela 1 pode ter registros X * Y * Z.

Isso se baseia em não saber como está a normalização ou o conteúdo das suas tabelas... se a chave é uma chave PRIMARY ou não..
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

Assim, a junção da Tabela 1 à Tabela 3 resultará (neste cenário) com 12 registros (cada um em 1 unido a cada um em 3). Então, tudo isso novamente vezes cada registro combinado na tabela 2 (5 registros)... total de 60 ( 3 tbl1 * 4 tbl3 * 5 tbl2 )count seria retornado.

Então, agora, pegue isso e expanda com base em seus milhares de registros e você verá como uma estrutura bagunçada pode sufocar uma vaca (por assim dizer) e matar o desempenho.
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