Tabele: Klienci i Zgloszenia są powiązane relacją jeden do wielu. Aby wybrać jedynie opis zgłoszenia oraz odpowiadające mu nazwisko klienta dla zgłoszenia numer 5, należy wydać polecenie

A.
SELECT opis, nazwisko FROM Zgloszenia JOIN Klienci ON Klienci.id = Zgloszenia.Klienci_id WHERE Zgloszenia.id = 5;
B.
SELECT opis, nazwisko FROM Zgloszenia JOIN Klienci ON Klienci.id = Zgloszenia.Klienci_id WHERE Klienci.id = 5;
C.
SELECT opis, nazwisko FROM Zgloszenia JOIN Klienci ON Klienci.id = Zgloszenia.id WHERE Zgloszenia.id = 5;
D.
SELECT opis, nazwisko FROM Zgloszenia JOIN Klienci WHERE Klienci.id = 5;
Pytanie z egzaminu CKE, czerwiec 2021 (arkusz EE.09-SG-21.06).
Poprawne polecenie to: SELECT opis, nazwisko FROM Zgloszenia JOIN Klienci ON Klienci.id = Zgloszenia.Klienci_id WHERE Zgloszenia.id = 5;. Kluczowe są tutaj dwie rzeczy: warunek złączenia oraz warunek filtrowania. Tabela Klienci jest tabelą nadrzędną, a tabela Zgloszenia przechowuje klucz obcy Klienci_id, który wskazuje na konkretnego klienta. Dlatego poprawne połączenie tabel wykonuje się przez Klienci.id = Zgloszenia.Klienci_id. Dopiero po takim połączeniu można pobrać pola z obu tabel: opis ze zgłoszenia oraz nazwisko klienta. Warunek WHERE Zgloszenia.id = 5 oznacza, że interesuje nas zgłoszenie numer 5, a nie klient numer 5. To drobna różnica, ale w praktyce bardzo ważna. Z mojego doświadczenia wynika, że większość pomyłek w SQL bierze się właśnie z mylenia klucza głównego z kluczem obcym. Dobrą praktyką jest też dopisywanie nazw tabel przy kolumnach, np. Zgloszenia.opis i Klienci.nazwisko, zwłaszcza gdy w obu tabelach mogą istnieć kolumny o tej samej nazwie, np. id. W realnej aplikacji webowej taka kwerenda mogłaby służyć np. do wyświetlenia szczegółów zgłoszenia serwisowego razem z danymi osoby, która je dodała.
W tym zadaniu łatwo pomylić dwa różne identyfikatory: identyfikator klienta oraz identyfikator zgłoszenia. Treść mówi o „zgłoszeniu numer 5”, więc filtr powinien dotyczyć kolumny Zgloszenia.id, a nie Klienci.id. Jeśli użyje się warunku Klienci.id = 5, baza wybierze wszystkie zgłoszenia klienta o numerze 5, a nie jedno konkretne zgłoszenie numer 5. Wynik może wyglądać sensownie, ale logicznie będzie inny niż wymagany, i to jest taki dość typowy haczyk egzaminacyjny. Ważny jest też sposób łączenia tabel. W relacji jeden do wielu tabela podrzędna, czyli Zgloszenia, zawiera klucz obcy Klienci_id. Ten klucz obcy należy zestawić z kluczem głównym tabeli Klienci, czyli Klienci.id. Złączenie po Klienci.id = Zgloszenia.id jest błędne, bo porównuje dwa niezależne identyfikatory techniczne. To, że oba pola nazywają się id albo mają typ INTEGER, nie znaczy jeszcze, że opisują tę samą rzecz. Taki zapis może czasem zwrócić jakieś rekordy przypadkiem, ale będzie to przypadkowa zgodność numerów, a nie poprawna relacja między klientem i zgłoszeniem. Problemem jest również pominięcie warunku ON przy JOIN. W standardowym SQL złączenie powinno mieć jasno określony warunek powiązania tabel, inaczej można doprowadzić do iloczynu kartezjańskiego albo błędu składniowego, zależnie od systemu bazy danych. Moim zdaniem warto zawsze czytać schemat od strony kluczy: klucz główny w tabeli nadrzędnej, klucz obcy w tabeli podrzędnej, a potem dopiero WHERE z warunkiem na szukany rekord.