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 voorwerp | loan_id in het resultaat |
|---|---|
| Heeft een actieve uitlening | Een uitleen-ID zoals 501 |
| Heeft geen actieve uitlening | NULL |
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.