Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Format złączenia SQL — zagnieżdżone złączenia wewnętrzne

Aby zapewnić czytelność, zmieniłem strukturę zapytania... zaczynając od pozornego najwyższego poziomu będącego Table1, który następnie łączy się z Table3, a następnie Table3 łączy się z tabelą2. O wiele łatwiej śledzić, jeśli podążasz za łańcuchem relacji.

Teraz odpowiem na twoje pytanie. Otrzymasz dużą liczbę w wyniku produktu kartezjańskiego. Dla każdego rekordu w Tabeli 1, który pasuje do Tabeli 3, otrzymasz X * Y. Następnie, dla każdego dopasowania pomiędzy Tabelą 3 i Tabelą 2 będzie miał ten sam wpływ... Y * Z... Więc Twój wynik dla tylko jednego możliwego identyfikatora w Tabeli 1 może mieć rekordy X * Y * Z.

Opiera się to na tym, że nie wiesz, jak wygląda normalizacja lub zawartość Twoich tabel... czy klucz jest kluczem PODSTAWOWYM, czy nie.

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

Tak więc połączenie tabeli 1 z tabelą 3 spowoduje (w tym scenariuszu) 12 rekordów (każdy w 1 połączony z każdym w 3). Następnie wszystko to ponownie razy każdy dopasowany rekord w tabeli 2 (5 rekordów)... zostanie zwróconych łącznie 60 ( 3 tbl1 * 4 tbl3 * 5 tbl2 ).

A więc teraz weź to i rozwiń na podstawie swoich tysięcy rekordów, a zobaczysz, jak pomieszana struktura może udusić krowę (tak to powiem) i zabić wydajność.

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 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd podczas modyfikowania DAL, System.ArgumentException, Wpis z tym samym kluczem już istnieje

  2. Aktualizacja z wieloma warunkami. SQL 2008

  3. Transakcja rozproszonej bazy danych a transakcja między bazami danych

  4. SQL:Aktualizuj tabelę, gdzie kolumna =Wiele wartości

  5. zastąp NULL wartością pustą lub zerem w serwerze sql