Tabellen verknüpfen, statt Daten zu wiederholen · Übung
Die verfügbaren Gegenstände auswählen
Der Left-Join-Bericht gibt jetzt jedem Gegenstand eine von zwei sichtbaren Formen:
| Zustand des Gegenstands | loan_id im Ergebnis |
|---|---|
| Hat einen aktiven Ausleihvorgang | Eine Ausleih-ID wie 501 |
| Hat keinen aktiven Ausleihvorgang | NULL |
Diese fehlende verknüpfte ID ist der Nachweis, den wir brauchen. Öffne report.sql und füge diese Zeile vor ORDER BY hinzu:
WHERE loans.id IS NULL
Klicke auf Run. Der Bericht sollte den Klapptisch, die Projektionsleinwand und das Reparaturset enthalten. Der Bohrer und der Projektor haben aktive Treffer, also fehlen ihre Ausleih-IDs nicht und diese Gegenstände bestehen den neuen Filter nicht.
Der Klapptisch ist der nützliche Grenzfall. Er hat einen Ausleihverlauf, aber seine alte Zeile passt nicht zur Bedingung für ausschließlich aktive Vorgänge innerhalb von ON. Der Left Join behält den Gegenstand deshalb mit fehlenden Ausleihspalten. WHERE loans.id IS NULL wählt ihn neben Gegenständen, die noch nie ausgeliehen wurden, als verfügbar aus.
Ersetze diesen Filter nicht durch loans.returned_on IS NULL nach dem Join. Ein passender aktiver Ausleihvorgang hat bereits eine Rückgabeangabe von NULL, und ein Gegenstand ohne Treffer hat ebenfalls NULL in jeder verknüpften Ausleihspalte. Diese Prüfung würde sowohl ausgeliehene als auch verfügbare Gegenstände behalten. Die Prüfung loans.id IS NULL unterscheidet sie: Ein passender Ausleihvorgang hat eine ID, ein fehlender Treffer nicht. Behalte die Aktivbedingung innerhalb von ON; die WHERE-Klausel fragt, ob ein solcher Treffer gefunden wurde.
Das Ergebnis bleibt nach items.asset_tag sortiert:
IT-200 | Folding table | NULL
IT-400 | Projector screen | NULL
IT-500 | Repair kit | NULL
Submit mischt die Einfügereihenfolge und verwendet aktive, ausschließlich zurückgegebene und noch nie ausgeliehene Gegenstände. Es erwartet nur die letzten beiden Gruppen. Die SQL-Werte werden nicht mit einer Python-Wahrheitsprüfung getestet, und = NULL kann IS NULL nicht ersetzen.
Du kannst Verfügbarkeit jetzt beantworten, ohne eine zweite Verfügbarkeitsmarkierung zu speichern. Die aktuelle Antwort ergibt sich aus dem Vorhandensein oder Fehlen einer aktiven Beziehung. Sie kann daher nicht von dem Ausleihverlauf abweichen, den sie zusammenfasst.
Aufgabe
Füge report.sql eine WHERE-Bedingung hinzu, die Gegenstände behält, für die der auf aktive Vorgänge beschränkte Left Join keine Ausleihzeile gefunden hat. Gib nur verfügbare Gegenstände zurück und behalte die Inventarkennzeichen-Reihenfolge bei.