Ich betrachte diese alte SQL-Abfrage. Das Bit, das ich nicht bekommen kann, ist, warum es innerlich dieselbe Tabelle zweimal in denselben Spalten verbindet. Ich spreche von Tabelle1 und Tabelle1, die mit dem Alias "Table1Alias" verbunden sind.
SELECT DISTINCT othercolumns,
Table1Alias.columna
FROM maintable
INNER JOIN secondarytable
ON maintable.id1 = secondarytable.a_id1
INNER JOIN table1
ON secondarytable.id2 = table1.id3
INNER JOIN table1 Table1Alias
ON secondarytable.id2 = Table1Alias.id3
INNER JOIN thirdtable
ON table1.id4 = thirdtable.id5
INNER JOIN fourthtable
ON thirdtable.id6 = fourthtable.id7
INNER JOIN fivetable
ON thirdtable.id8 = fivetable.id9
INNER JOIN sixthtable
ON Table1Alias.columna = sixthtable.id10
LEFT JOIN seventhtable
ON thirdtable.id11 = seventhtable.id12
WHERE LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09'
AND secondarytable.type456 = 'cate'
AND table1.type = '0'
AND Table1Alias.columna = 'conn'
sql-server
Mathematik
quelle
quelle
Antworten:
Es kann hilfreich sein, die Abfrage wie folgt umzuschreiben, sodass es offensichtlich ist, dass die beiden Verknüpfungen unterschiedlich sind , dh die Verknüpfungen zu unterschiedlichen Teilmengen (derselben Tabelle):
quelle
INNER JOIN (SELECT * FROM table1 WHERE type = 0) table1
. Das könnte es noch offensichtlicher machen, was passiert.ON
Klausel eines Joins oder in derWHERE
Klausel enthalten ist, kann sehr wichtig sein, wenn der Join eine istOUTER JOIN
. Wenn eine Bedingung in derON
Klausel fehlschlägt , ist die primäre Zeile weiterhin enthalten (ohne eine übereinstimmende äußere Zeile). Wenn dies in derWHERE
Klausel fehlschlägt , wird die primäre Zeile aus der Ergebnismenge ausgeschlossen.Wenn Sie sich die
where
Klausel ansehen, muss für die Zeile, auf die von gezeigt wirdtable1
, die Spaltetype
= '0' und für die Zeile, auf die von gezeigt wirdtable1alias
, die Spaltecolumna
= 'conn' sein.Vielleicht gibt es mehrere Zeilen
table1
für dasselbeid3
?quelle
Ohne die Tabellenstruktur zu sehen, könnte der Ansatz darin bestehen, einen kleineren nicht abdeckenden Index zu verwenden und dann einen größeren abdeckenden Index in die Tabelle aufzunehmen, um den Rest der Zeilen zu erhalten, um eine 'Key Lookup'-Operation zu vermeiden und vorhandene Indizes nicht zu ändern (oder wenn Sie die Indizes nicht ändern können)
quelle
Wenn eine Tabelle in einem komplexen Join mehrmals vorkommt, liegt dies normalerweise daran, dass eine Entität an mehr als einer Beziehung beteiligt ist. Dies scheint hier der Fall zu sein, gemessen an der Antwort, die @Ypercube gegeben hat.
Entitäten und Beziehungen werden im Allgemeinen durch die Semantik der Daten und die Verbindung zum zugrunde liegenden Gegenstand verstanden. Wenn Ihr Altsystem sorgfältig erstellt wurde, haben sie wahrscheinlich einige Sorgfalt darauf verwendet, das Thema zu analysieren und jedes der Datenelemente sorgfältig zu definieren. Möglicherweise haben sie sogar ein Entity-Relationship-Modell erstellt. All diese sorgfältige Arbeit ist möglicherweise verloren gegangen, und Sie müssen sie nicht mehr rekonstruieren, indem Sie sich in die Vergangenheit vertiefen. Das ist ein bisschen wie Archäologie.
Bei Tabellennamen wie Tabelle1 haben wir keine Ahnung, wie Ihr Thema funktioniert. Und selbst wenn die Namen beschreibend wären, kann sich unser Verständnis des Themas Ihres Systems stark von dem unterscheiden, was in Ihrem Fall benötigt wird. Es wird an dir liegen.
quelle