0%

Verbind tabellen in plaats van gegevens te herhalen · oefening

Behoud voorwerpen zonder actieve uitlening

Een rapport van actieve uitleningen begint bij loans, dus beschikbare voorwerpen hebben geen rij om bij te dragen. De klaptafel ontbreekt, ook al is de enige uitlening ervan afgerond. Het projectiescherm en de reparatieset ontbreken omdat ze helemaal geen uitleengeschiedenis hebben.

Begin voor een beschikbaarheidsvraag bij de tabel waarvan alle rijen moeten blijven staan: items.

Vervang report.sql door deze geselecteerde vorm en volgorde:

SELECT
    items.asset_tag,
    items.name AS item_name,
    loans.id AS loan_id
FROM items
ORDER BY items.asset_tag;

Voeg daarna deze join toe vóór ORDER BY:

LEFT JOIN loans
    ON loans.item_id = items.id
    AND loans.returned_on IS NULL

Een left join behoudt elke rij uit de tabel links ervan. Wanneer de ON-voorwaarde een actieve uitlening vindt, voegt SQLite de kolommen van die uitlening toe. Wanneer er geen actieve overeenkomst is, blijft het voorwerp staan en zijn de uitleenkolommen in het resultaat NULL.

De test op een actieve uitlening hoort binnen ON. Die bepaalt welke uitleenrijen aan een voorwerp mogen worden gekoppeld. Dit detail beschermt de klaptafel: de afgeronde uitlening uit de geschiedenis voldoet niet, maar de left join behoudt het voorwerp zelf wel.

Druk op Run. Alle vijf de inventariscodes horen te verschijnen. De boormachine en projector hebben uitleen-ID’s. De andere drie tonen NULL:

IT-200 | Folding table | NULL
IT-400 | Projector screen | NULL
IT-500 | Repair kit | NULL

Als returned_on IS NULL naar een latere WHERE-clausule zou verhuizen, zou de rij van de afgeronde klaptafeluitlening eerst worden gekoppeld en daarna worden weggefilterd. Het voorwerp zou verdwijnen in plaats van zonder gekoppelde uitlening over te blijven. Houd de voorwaarde voor een actieve uitlening naast de relatie binnen ON.

Deze voorbeelden hebben hoogstens één actieve uitlening per voorwerp. Een left join geeft één rij per overeenkomst terug, dus twee actieve uitleningen voor hetzelfde voorwerp zouden twee rijen voor dat voorwerp opleveren. Later dwingt de uitleenbewerking de regel van één actieve uitlening af voor ons programma voor één gebruiker.

Submit bevat een actief uitgeleend voorwerp, een voorwerp met alleen afgeronde uitleningen en een voorwerp zonder geschiedenis. Het verwacht elk voorwerp precies één keer. Dit rapport toont nu de volledige catalogus en maakt het ontbreken van een actieve overeenkomst zichtbaar. Die ontbrekende overeenkomst is precies wat je nodig hebt om alleen beschikbare voorwerpen te selecteren.

Opdracht

Bouw report.sql om rond items LEFT JOIN loans. Koppel loans.item_id aan items.id en houd de test voor actieve uitleningen binnen ON. Geef asset_tag, item_name en loan_id terug voor elk voorwerp, in volgorde van inventariscode.