Ich habe oft gesehen, dass Leute die JOIN-Klausel mit tabellenbezogenen Bedingungen versehen. Siehe dieses Beispiel,
SELECT i.Name
FROM sys.TABLES AS tbl
INNER JOIN sys.indexes AS i
ON (i.index_id > 0 AND i.is_hypothetical = 0)
AND (i.object_id = tbl.object_id)
WHERE (i.is_unique = 1 AND i.is_disabled = 0)
AND (tbl.Name = 'Warehouse')
SELECT i.Name
FROM sys.TABLES AS tbl
INNER JOIN sys.indexes AS i
ON (i.object_id = tbl.object_id)
WHERE (i.index_id > 0 AND i.is_hypothetical = 0)
AND (i.is_unique = 1 AND i.is_disabled = 0)
AND (tbl.Name = 'Warehouse')
Die Abfrage ist dieselbe, aber der Unterschied besteht darin, dass die erste (i.index_id > 0 AND i.is_hypothetical = 0)
in der JOIN-Klausel verwendet wird, während die zweite dieselbe in der WHERE-Klausel verwendet. Beeinträchtigt dies die Abfrage oder die Leistung?
sql-server
sql-server-2012
user960567
quelle
quelle
INNER JOIN
sind das gleichwertige Abfragen. Wenn SieOUTER JOIN
die Bedingung auf die Verknüpfungsbedingung anstatt auf die setzenWHERE
, ändern sich Ihre Ergebnisse. Seien Sie also vorsichtig.Antworten:
Wie JNK sagte,
INNER JOIN
werden diese zum einen gleich sein. Sie können dies beweisen, indem Sie die tatsächlichen (nicht mit geschätzten ) Ausführungspläne vergleichen. In diesem Fall sind sie genau gleich ( zum Vergrößern anklicken ):Persönlich möchte ich die Verknüpfungsbedingungen und die Filterbedingungen getrennt halten. Join-Bedingungen werden in die
ON
Klausel und Filterbedingungen in dieWHERE
Klausel aufgenommen. Dies ist einer der Hauptvorteile einer explizitenINNER JOIN
Syntax, die dazu beiträgt, das Risiko zu verringern, dass zu viele Zeilen zurückgegeben werden, da Joins im alten Stil nicht genügend (oder gar keine ) Join-Kriterien enthalten (Filter- und Join-Kriterien) werden zusammengeworfen) - siehe diesen Blog-Beitrag für weitere Details .JNK hat aber auch Recht, dass Sie vorsichtig sein müssen, wenn Sie darüber sprechen
OUTER JOIN
. Ein einfaches Beispiel:Ergebnisse:
Wie Sie den Ergebnissen entnehmen können, gibt die erste Abfrage weiterhin alle drei Zeilen von zurück
a
(wie zu erwarten), die zweite Abfrage verwandelt jedoch dieOUTER JOIN
in eineINNER JOIN
und gibt nur die Zeilen vona
mit einer Übereinstimmung vonb
unter allen Bedingungen zurück. Möglicherweise möchten Sie das eine oder andere Verhalten, daher ist keines davon "schlechter" oder "falsch". Es ist nur wichtig, die verschiedenen Funktionen zu verstehen, damit Sie die Abfrage schreiben können, um die gewünschten Ergebnisse zu erzielen.quelle