Die folgende Abfrage, die eine Zeile für jeden Reading_Type zurückgeben soll, plus den gespeicherten Lesewert für diesen Reading_Type und das Datum oder 0 falls nein Das Lesen wurde gespeichert.SQL JOIN - gibt eine Zeile für jede Tabelle A zurück, unabhängig davon, ob Tabelle B Werte enthält oder nicht
SELECT
t.*
, ISNULL(r.Reading, 0) AS Reading
FROM
Reading_Type t
LEFT JOIN
Reading r ON t.Reading_Type_ID = r.Reading_Type_ID
WHERE
r.Reading_Date = @date
OR r.Reading_Date IS NULL
- Es tut Arbeit, wenn es keine Lesungen für ein beliebiges Datum gespeichert
- Es tut Arbeit, wenn die einzigen gespeicherten Messwerte für das ausgewählte Datum sind.
- Es tut nicht Arbeit, wenn ein Reading_Type ein gerettet hat für Datum X Lesen, keine Lese für Datum Y gespeichert, und die Suche nach Datum Y.
Reading_Type
Tabelle:
Reading_Type_ID Reading_Type
-----------------------------
1 Red
2 Blue
3 Green
Reading
Tabelle (Tabelle leer ist):
Reading_ID Reading_Type_ID Reading Reading_Date
-----------------------------------------------------
Abfrage mit @date = April 15, 2016
Rückgabe:
Reading_Type_ID Reading_Type Reading
----------------------------------------
1 Red 0
2 Blue 0
3 Green 0
Reading
Tabelle (Tabelle Daten für April 15 hat):
Reading_ID Reading_Type_ID Reading Reading_Date
-----------------------------------------------------
1 1 5 April 15, 2016
2 3 8 April 15, 2016
Abfrage mit @date = April 15, 2016
Rückkehr:
Reading_Type_ID Reading_Type Reading
----------------------------------------
1 Red 5
2 Blue 0
3 Green 8
Abfrage mit @date = April 7, 2016
Rückkehr:
Reading_Type_ID Reading_Type Reading
----------------------------------------
1 Red 0
3 Green 0
Die dritte Abfrage sollte immer noch eine Zeile für Reading_Type = Blau mit 0 für Reading zurückgeben. Wie behebe ich meine Anfrage?
vielleicht gibt es keine Reading_Type für 7. April 2016? – FLICKER
@FLICKER Ich denke, das ist der Punkt. – TZHX