0%

Verbind tabellen in plaats van gegevens te herhalen · oefening

Selecteer de beschikbare voorwerpen

Het rapport met de left join geeft elk voorwerp nu één van twee zichtbare vormen:

Toestand van het voorwerploan_id in het resultaat
Heeft een actieve uitleningEen uitleen-ID zoals 501
Heeft geen actieve uitleningNULL

Dat ontbrekende gekoppelde ID is het bewijs dat we nodig hebben. Open report.sql en voeg deze regel toe vóór ORDER BY:

WHERE loans.id IS NULL

Druk op Run. Het rapport hoort de klaptafel, het projectiescherm en de reparatieset te bevatten. De boormachine en projector hebben actieve overeenkomsten, dus hun uitleen-ID’s ontbreken niet en die voorwerpen komen niet door het nieuwe filter.

De klaptafel is het nuttige grensgeval. Die heeft uitleengeschiedenis, maar de oude rij voldoet niet aan de voorwaarde voor alleen actieve uitleningen binnen ON. De left join behoudt het voorwerp daarom met ontbrekende uitleenkolommen. WHERE loans.id IS NULL selecteert het als beschikbaar, naast voorwerpen die nog nooit zijn geleend.

Vervang dit filter niet door loans.returned_on IS NULL na de join. Een actieve gekoppelde uitlening heeft al een NULL-retourwaarde, en een ongekoppeld voorwerp heeft ook NULL in elke gekoppelde uitleenkolom. Die test zou zowel uitgeleende als beschikbare voorwerpen behouden. loans.id IS NULL testen onderscheidt ze: een gekoppelde uitlening heeft een ID, terwijl dat bij een ontbrekende overeenkomst ontbreekt. Houd de voorwaarde voor een actieve uitlening binnen ON; de WHERE-clausule vraagt of zo’n overeenkomst is gevonden.

Het resultaat blijft geordend op items.asset_tag:

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

Submit husselt de invoegvolgorde en gebruikt actief uitgeleende voorwerpen, voorwerpen met alleen afgeronde uitleningen en nooit uitgeleende voorwerpen. Het verwacht alleen de laatste twee groepen. De SQL-waarden worden niet met Python-truthiness getest en = NULL kan IS NULL niet vervangen.

Je kunt beschikbaarheid nu beantwoorden zonder een tweede beschikbaarheidsvlag op te slaan. Het huidige antwoord volgt uit de aan- of afwezigheid van een actieve relatie en kan daardoor niet afwijken van de uitleengeschiedenis die het samenvat.

Opdracht

Voeg één WHERE-voorwaarde toe aan report.sql die voorwerpen behoudt waarvoor de left join op actieve uitleningen geen uitleenrij heeft gevonden. Geef alleen beschikbare voorwerpen terug en behoud de volgorde op inventariscode.