Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Join-Format – verschachtelte innere Joins

Aus Gründen der Lesbarkeit habe ich die Abfrage umstrukturiert ... beginnend mit der scheinbar obersten Ebene, die Tabelle1 ist, die dann mit Tabelle3 und dann mit Tabelle3 verknüpft ist. Viel einfacher zu verfolgen, wenn Sie der Beziehungskette folgen.

Nun, um Ihre Frage zu beantworten. Als Ergebnis eines kartesischen Produkts erhalten Sie eine große Anzahl. Für jeden Datensatz in Tabelle1, der in Tabelle3 übereinstimmt, haben Sie X * Y. Dann hat jede Übereinstimmung zwischen Tabelle3 und Tabelle2 die gleiche Auswirkung ... Y * Z ... Ihr Ergebnis also für nur eine mögliche ID in Tabelle 1 kann X * Y * Z Datensätze haben.

Dies basiert darauf, dass Sie nicht wissen, wie die Normalisierung oder der Inhalt Ihrer Tabellen ist ... ob der Schlüssel ein PRIMARY-Schlüssel ist oder nicht ...

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

Das Verbinden von Tabelle 1 mit Tabelle 3 ergibt also (in diesem Szenario) 12 Datensätze (jeder in 1, verbunden mit jedem in 3). Dann wird all das noch einmal für jeden übereinstimmenden Datensatz in Tabelle 2 (5 Datensätze) ... insgesamt 60 ( 3 tbl1 * 4 tbl3 * 5 tbl2 )count zurückgegeben.

Nehmen Sie das jetzt und erweitern Sie es basierend auf Ihren Tausenden von Aufzeichnungen, und Sie sehen, wie eine verkorkste Struktur eine Kuh ersticken (sozusagen) und die Leistung töten kann.

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