MS SQL Studio: NOT IN funktioniert nicht

Bunga

Neuer Benutzer
Beiträge
2
Guten Morgen, ich bin mit meinem Latein am Ende. Ich möchte mir gerne das Bestelldatum einzelner Kunden in chronologischer aufsteigender Folge nebeneinander darstellen, um anschließend die Dauer zwischen den Bestellungen zu ermitteln. Ich versuche das Ganze über min(Vorgangsdatum) zu lösen. Leider erhalte ich beim 2. und 4. Kauf nur NULL und beim 3. und 5. Kauf das Vorgangsdatum aus dem 1. Kauf. Hier mein Script für Kauf 1 und 2:

select KundenID,Produktobergruppe, min(Vorgangsdatum) Kauf_1

into #Test_Kauf_1
from #TEST1

group by KundenID,Produktobergruppe
order by KundenID

select KundenID,Produktobergruppe,min(Vorgangsdatum) Kauf_2
into #Test_Kauf_2
from #TEST1 a
where a.Vorgangsdatum not in (select b.Kauf_1 from #Test_Kauf_1 b where KundenID=KundenID and Produktobergruppe=Produktobergruppe)
group by KundenID,Produktobergruppe
order by KundenID


Das kuriose ist, dass ich mit Beispieldatensätzen aus 100.000 Zeilen ein Ergebnis erhalten. Lasse ich das Ganze aber über die komplette Datenbank laufen (20 Mio Datensätze) erhalte ich die o.g. Fehler. Vielen Dank für Eure Hilfe
 
Werbung:
Werbung:
Sobald nur ein NULL Wert in dem Sub-Select zurückgegeben wird, ist NOT IN immer "false". Ein Möglichkeit damit umzugehen ist, die NULL Werte im Sub-Select herauszufiltern.

Ausserdem solltest Du immer alle Spalten über den Tabellen-Alias referenzieren, sonst kann es ein paar sehr blöde Überraschungen geben:

Code:
where a.Vorgangsdatum not in (select b.Kauf_1
                              from #Test_Kauf_1 b
                              where b.KundenID = a.KundenID
                              and b.Produktobergruppe = a.Produktobergruppe
                              and b.Kauf_1 IS NOT NULL)

Alternativ (und häufig auch schneller) das NOT IN in ein NOT EXISTS ändern:

Code:
where NOT EXISTS (select *
                  from #Test_Kauf_1 b
                  where b.KundenID = a.KundenID
                  and b.Produktobergruppe = a.Produktobergruppe
                  and b.Kauf_1 = a.Vorgangsdatum)
 
Zurück
Oben