2009-05-15 21 views
1

Warum würden die folgenden Abfragen unterschiedliche Ergebnismengen zurückgeben?Warum unterschiedliche SQL-Ergebnisse?

select count(ml.link_type),mc.conv_string 
from MSP_CONVERSIONS mc,MSP_LINKS ml 
where ml.PROJ_ID = 4 
and mc.STRING_TYPE_ID = 3 
and mc.CONV_VALUE *= ml.link_type 
group by mc.conv_string 

select count(ml.link_type),mc.conv_string 
from MSP_CONVERSIONS mc left outer join MSP_LINKS ml on mc.CONV_VALUE = ml.LINK_TYPE 
where ml.PROJ_ID = 4 
and mc.STRING_TYPE_ID = 3 
group by mc.conv_string 

Die erste Abfrage zurückgibt:

3 FF

10790 FS

0 SF

117 SS

Die zweite Abfrage zurückgibt:

3 FF

10790 FS

117 SS

Beide Abfragen sind für eine SQL Server 2008 laufen Standard-Datenbank. Ich kann nicht verstehen, warum zwei verschiedene Ergebnismengen zurückgegeben werden. Ich dachte, dass * = Shorthand-Syntax für LEFT OUTER JOIN war. Ich habe mir das schon so lange angesehen, vielleicht habe ich etwas Kleines übersehen?

Dank ...

Antwort

4

Weil Ihre erste Abfrage ist wirklich entspricht dies:

select count(ml.link_type),mc.conv_string 
from MSP_CONVERSIONS mc 
LEFT JOIN MSP_LINKS ml 
    ON ml.PROJ_ID = 4 
    and mc.STRING_TYPE_ID = 3 
    and mc.CONV_VALUE = ml.link_type 
group by mc.conv_string 

Sie alle Bedingungen in der Verbindung nach oben gezogen haben, ist es unmöglich, jemals vollständig auszufiltern jeder machen Zeilen aus der Tabelle MSP_CONVERSIONS. Am besten bleiben Sie immer mit der vollen LINKS/INNEREN VERBINDUNG Syntax und vermeiden Sie die Verwirrung.

+0

Vielen Dank für die Antwort, aber das Abfrage-Beispiel, das Sie angegeben haben, gibt EVERY mc.conv_string zurück. Diese Abfrage gibt Dinge, wie ich brauchte: select count (ml.link_type), von MSP_CONVERSIONS mc LEFT OUTER JOIN mc.conv_string MSP_LINKS ml ON mc.CONV_VALUE = ml.link_type und ml.PROJ_ID = 4 wo mc.STRING_TYPE_ID = 3 Gruppe von mc.conv_string Vielen Dank für Ihre Hilfe. –

2

"* =" ist nicht so viel "Kurzschreib" -Syntax wie alt-Mode vor-ANSI OUTER JOIN-Syntax. Benutze es nicht. Wenn Sie in der Auswahl "LEFT OUTER JOIN b ..." haben, ist das Hinzufügen zusätzlicher Kriterien zu "b" in der WHERE-Klausel im Allgemeinen eine schlechte Idee - wenn es als Filterung für das Ergebnis gelesen wird des Joins, dann werden alle Zeilen gelöscht, in denen keine Übereinstimmung in b gefunden wurde. Dadurch wird Ihre äußere Verknüpfung effektiv in eine innere Verknüpfung umgewandelt.

Dies hängt mit dem zusammen, was Joel geschrieben hat --- mit allen Bedingungen in der "ON" -Klausel bedeutet, dass die Filterung zum Zeitpunkt des Beitritts angewendet wird, und das ist ein anderes Ergebnis. Die ANSI-Syntax ist expliziter.

+0

+1 - ANSI-89-Syntax ist böse. SQL Server verarbeitet die ANSI-92-Syntax (Explicit Join) tatsächlich in mehreren Situationen leistungsfähiger, sodass Sie bei expliziten Joins bleiben sollten. –

+0

Dies sollte auch nicht verwendet werden, da es falsch interpretiert werden kann und die richtigen Ergebnisse nicht garantiert werden können, sogar so weit zurück wie SQL Server 2000. Dies ist einfach nur schlechter Code. Es ist auch veraltet. – HLGEM

Verwandte Themen