In Anbetracht dieses Schemas:
CREATE TABLE #TEST_COALESCE
(
Id int NOT NULL,
DateTest datetime NOT NULL,
PRIMARY KEY (Id, DateTest)
);
INSERT INTO #TEST_COALESCE VALUES
(1, '20170201'),
(1, '20170202'),
(1, '20170203'),
(2, '20170204'),
(2, '20170205'),
(2, '20170206');
Wenn ich COALESCE in einer Unterabfrage verwende, wird NULL zurückgegeben.
SELECT t1.Id, t1.DateTest,
(SELECT TOP 1 COALESCE(t2.DateTest, t1.DateTest)
FROM #TEST_COALESCE t2
WHERE t2.Id = t1.Id
AND t2.DateTest > t1.DateTest
ORDER BY t2.Id, t2.DateTest) NextDate
FROM #TEST_COALESCE t1;
+----+---------------------+---------------------+
| Id | DateTest | NextDate |
+----+---------------------+---------------------+
| 1 | 01.02.2017 00:00:00 | 02.02.2017 00:00:00 |
| 1 | 02.02.2017 00:00:00 | 03.02.2017 00:00:00 |
| 1 | 03.02.2017 00:00:00 | NULL |
| 2 | 04.02.2017 00:00:00 | 05.02.2017 00:00:00 |
| 2 | 05.02.2017 00:00:00 | 06.02.2017 00:00:00 |
| 2 | 06.02.2017 00:00:00 | NULL |
+----+---------------------+---------------------+
Wenn es sich jedoch außerhalb der Unterabfrage befindet:
SELECT t1.Id, t1.DateTest,
COALESCE((SELECT TOP 1 t2.DateTest
FROM #TEST_COALESCE t2
WHERE t2.Id = t1.Id
AND t2.DateTest > t1.DateTest
ORDER BY t2.Id, t2.DateTest), t1.DateTest) NextDate
FROM #TEST_COALESCE t1;
+----+---------------------+---------------------+
| Id | DateTest | NextDate |
+----+---------------------+---------------------+
| 1 | 01.02.2017 00:00:00 | 02.02.2017 00:00:00 |
| 1 | 02.02.2017 00:00:00 | 03.02.2017 00:00:00 |
| 1 | 03.02.2017 00:00:00 | 03.02.2017 00:00:00 |
| 2 | 04.02.2017 00:00:00 | 05.02.2017 00:00:00 |
| 2 | 05.02.2017 00:00:00 | 06.02.2017 00:00:00 |
| 2 | 06.02.2017 00:00:00 | 06.02.2017 00:00:00 |
+----+---------------------+---------------------+
Warum die erste Unterabfrage nicht zurück: t1.DateTest
?
sql-server
McNets
quelle
quelle
Antworten:
Dinge in der Auswahl werden nur zurückgegeben, wenn Zeilen in der FROM-Anweisung zurückgegeben werden.
Lassen Sie uns zunächst konzeptionell darüber nachdenken.
Abfrage 1 ist wie folgt:
Die Abfrage würde ohne Zeilen zurückkommen - weil kein Ferrari in der Garage war. (Zumindest wurden in meiner Garage keine Zeilen gefunden.)
Abfrage 2 ist anders:
Aus diesem Grund muss sich die Vereinigung außerhalb der Suchoperation befinden: Sie müssen dies auch dann tun, wenn die Ergebnismenge keine Zeilen enthält.
Schauen wir uns nun Ihre Anfrage an.
Ich werde die Unterabfrage alleine ausführen und Werte für eine der Zeilen, in denen COALESCE funktionieren soll, hart codieren, aber es kann nicht:
In der WHERE-Klausel habe ich Id = 1 und DateTest> '2017-02-03 00: 00: 00.000' fest codiert. Wenn diese Abfrage ausgeführt wird, werden keine Ergebnisse zurückgegeben:
Deshalb funktioniert die COALESCE nicht: In dieser Ergebnismenge waren keine Zeilen und in Ihrer Garage keine Ferraris. Beherrsche dieses Konzept und du wirst Ferraris in deiner ... Moment mal ... Ich habe dieses Konzept gemeistert und es gibt keine Ferraris in meiner Garage ...
quelle