PHP Rocks
[MSSQL/T-SQL] Subselect mit AND verknüpfter Bedingung liefert mehr Datensätze als erwartet - Druckversion

+- PHP Rocks (https://www.php-rocks.de)
+-- Forum: Datenbanken (https://www.php-rocks.de/https://www.php-rocks.de/forum/6-datenbanken.html)
+--- Forum: Andere SQL Datenbanken (https://www.php-rocks.de/https://www.php-rocks.de/forum/9-andere-sql-datenbanken.html)
+--- Thema: [MSSQL/T-SQL] Subselect mit AND verknüpfter Bedingung liefert mehr Datensätze als erwartet (/https://www.php-rocks.de/thema/60-subselect-mit-and-verknuepfter-bedingung-liefert-mehr-datensaetze-als-erwartet.html)



Subselect mit AND verknüpfter Bedingung liefert mehr Datensätze als erwartet - Arne Drews - 22.05.2015

Hallo,

Ich poste mal zu Beginn die Query, damit ihr wisst, worum es geht:
Code:
select
lieferscheine.* -- der Kürze halber

from
VKBelege lieferscheine

where
lieferscheine.Belegkennzeichen = 'VLL'
and lieferscheine.BelID not in ( select ReferenzBelID from VKBelege where ReferenzBelID is not null and Belegkennzeichen = 'VFR' )

order by
lieferscheine.Belegdatum desc
Ich suche quasi alle Lieferscheine, zu denen scheinbar noch keine Rechnungen erstellt wurden. Das Belegkennzeichen VLL steht für die Lieferscheine, VFR für Rechnungen.
Jeder Beleg, egal ob Lieferschein oder Rechnung hat eine eindeutige BelID. Für den Fall, daß aus einem Lieferschein bereits eine Rechnung erstellt wurde, gibt es die ReferenzBelID in der Rechnung, die der BelID des Lieferscheins entspricht.

Die Logik ist damit klar:
Code:
Selektiere alle Lieferscheine, deren BelegID in keiner ReferenzID der Rechnungen vorhanden ist.

Was mich ein wenig aus dem Konzept bringt:
So wie oben im Code, bekomme ich 796 Datensätze.
Wenn ich in dem Subselect das and Belegekennzeichen = 'VFR' entferne, bekomme ich nur noch 264 Datensätze.

Warum bekomme ich denn mehr Datensätze, wenn ich die Ergebnismenge des Subselects weiter eingrenze?

Da habe ich ein kleines Verständnis-Problem und freue mich auf erleuchtende Hinweise.
Undecided


RE: [MSSQL] Subselect mit AND verknüpfter Bedingung liefert mehr Datensätze als erwartet - tkausl - 23.05.2015

Zitat:Warum bekomme ich denn mehr Datensätze, wenn ich die Ergebnismenge des Subselects weiter eingrenze?

Durch deine invertierte Abhängigkeit (NOT in) ist die Chance, dass in deiner Haupt Query ein Datensatz herausgefiltert wird natürlich höher bei mehr SubQuery results. D.h. desto mehr du die SubQuery einschränkst und desto weniger Zeilen sie erzeugt, desto mehr Zeilen wirst du in der HauptQuery bekommen und umgekehrt.


RE: [MSSQL] Subselect mit AND verknüpfter Bedingung liefert mehr Datensätze als erwartet - Arne Drews - 23.05.2015

Verdammt... Du hast recht... Jetzt klingt's sogar logisch... Blush

Danke