Ich stieß auf dieses interessante Verhalten. Ich sehe Links-Join ist der Weg zu gehen, würde aber immer noch gerne dies gelöscht haben. Ist es ein Bug oder Verhalten By-Design? Irgendwelche Erklärungen?SQL SELECT mit "IN" Unterabfrage gibt keine Datensätze zurück, wenn die Unterabfrage NULL enthält
Wenn ich Datensätze aus der linken Tabelle auswähle, bei denen im Ergebnis einer Unterabfrage in der rechten Tabelle kein Wert vorhanden ist, wird der erwartete "fehlende" Datensatz nicht zurückgegeben, wenn das Ergebnis der Unterabfrage Nullen enthält. Ich habe erwartet, dass die beiden Möglichkeiten, diese Abfrage zu schreiben, gleichwertig sind.
Danke!
declare @left table (id int not null primary key identity(1,1), ref int null)
declare @right table (id int not null primary key identity(1,1), ref int null)
insert @left (ref) values (1)
insert @left (ref) values (2)
insert @right (ref) values (1)
insert @right (ref) values (null)
print 'unexpected empty resultset:'
select * from @left
where ref not in (select ref from @right)
print 'expected result - ref 2:'
select * from @left
where ref not in (select ref from @right where ref is not null)
print 'expected result - ref 2:'
select l.* from @left l
left join @right r on r.ref = l.ref
where r.id is null
print @@version
gibt:
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
unexpected empty resultset:
id ref
----------- -----------
(0 row(s) affected)
expected result - ref 2:
id ref
----------- -----------
2 2
(1 row(s) affected)
expected result - ref 2:
id ref
----------- -----------
2 2
(1 row(s) affected)
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2) (Hypervisor)
-Design? Ist das Wort Zustimmung nicht? –
Sehr gut gemacht. Vielen Dank! – Rbjz