Tabellen verknüpfen, statt Daten zu wiederholen · Übung
Gegenstände ohne aktiven Ausleihvorgang behalten
Ein Bericht über aktive Ausleihvorgänge beginnt bei loans, also haben verfügbare Gegenstände keine Zeile beizutragen. Der Klapptisch fehlt, obwohl sein einziger Ausleihvorgang bereits durch Rückgabe abgeschlossen wurde. Die Projektionsleinwand und das Reparaturset fehlen, weil sie überhaupt keinen Ausleihverlauf haben.
Beginne bei einer Verfügbarkeitsfrage mit der Tabelle, deren Zeilen alle erhalten bleiben müssen: items.
Ersetze report.sql durch diese Auswahl und Sortierung:
SELECT
items.asset_tag,
items.name AS item_name,
loans.id AS loan_id
FROM items
ORDER BY items.asset_tag;
Füge dann diesen Join vor ORDER BY hinzu:
LEFT JOIN loans
ON loans.item_id = items.id
AND loans.returned_on IS NULL
Ein Left Join behält jede Zeile aus der Tabelle auf seiner linken Seite. Wenn die ON-Bedingung einen aktiven Ausleihvorgang findet, ergänzt SQLite dessen Spalten. Wenn sie keinen aktiven Treffer findet, bleibt der Gegenstand erhalten und die Ausleihspalten im Ergebnis sind NULL.
Die Prüfung auf aktive Ausleihvorgänge gehört in ON. Sie sagt, welche Ausleihzeilen zu einem Gegenstand passen dürfen. Dieses Detail schützt den Klapptisch: Sein zurückgegebener Verlauf passt nicht, aber der Left Join behält den Gegenstand selbst trotzdem.
Klicke auf Run. Alle fünf Inventarkennzeichen sollten erscheinen. Der Bohrer und der Projektor haben Ausleih-IDs. Die anderen drei zeigen NULL:
IT-200 | Folding table | NULL
IT-400 | Projector screen | NULL
IT-500 | Repair kit | NULL
Würde returned_on IS NULL in eine spätere WHERE-Klausel verschoben, würde die zurückgegebene Klapptischzeile zuerst zugeordnet und anschließend herausgefiltert. Sie würde verschwinden, statt zu einem Gegenstand ohne Treffer zu werden. Halte die Aktivbedingung neben der Beziehung innerhalb von ON.
Diese Beispiele haben höchstens einen aktiven Ausleihvorgang pro Gegenstand. Ein Left Join gibt für jeden Treffer eine Zeile zurück. Zwei aktive Ausleihvorgänge für denselben Gegenstand würden daher zwei Zeilen für diesen Gegenstand erzeugen. Später setzt die Ausleihoperation die Regel eines einzigen aktiven Ausleihvorgangs für unser Einzelbenutzerprogramm durch.
Submit enthält einen aktiv ausgeliehenen Gegenstand, einen mit ausschließlich zurückgegebenen Ausleihvorgängen und einen ohne Verlauf. Es erwartet jeden Gegenstand genau einmal. Dieser Bericht zeigt jetzt den vollständigen Katalog und macht den fehlenden aktiven Treffer sichtbar. Genau diesen fehlenden Treffer brauchst du, um nur verfügbare Gegenstände auszuwählen.
Aufgabe
Gestalte report.sql um items LEFT JOIN loans herum neu. Ordne loans.item_id der items.id zu und halte die Prüfung auf einen aktiven Ausleihvorgang innerhalb von ON. Gib asset_tag, item_name und loan_id für jeden Gegenstand in Inventarkennzeichen-Reihenfolge zurück.