Analiza kodu - zadanie 2
Mamy dwie tabele:
SELECT * FROM Vehicle
Id | Mark |
---|---|
1 | Truck |
2 | SportCar |
3 | Motorcycle |
SELECT * FROM VehiclePrice
Id | Price | VehicleId |
---|---|---|
1 | 1100 | 1 |
2 | 1300 | 2 |
3 | 150 | NULL |
Programista za zadanie miał wyświetlić wszystkie pojazdy bez przypisanej ceny.
Co będzie rezultatem poniższego zapytania?
SELECT *
FROM Vehicle
WHERE Id NOT IN (SELECT VehicleId FROM VehiclePrice)
Uzasadnij swoją odpowiedź. Jeśli uważasz, że te zapytanie można poprawić, podaj poprawną wersję.
Uzasadnienie
By zapytanie działo poprawnie w podzapytaniu w klauzuli WHERE powinniśmy użyć warunku IS NOT NULLZapytanie powinno wyglądać następująco:Jeśli porównujemy jakąkolwiek wartość do NULL, wynikiem logicznym porównania będzie 'unknown' (pamiętaj - false nie równa się 'unknown').
Mimo tego, że w wyniku podzapytania nie będzie VehicleId = 3, rezultatem całego zapytania nie będzie
3 Motorcycle
. Jeśli zbiór zwracany przez podzapytanie zawiera wartość NULL, efektem końcowym zapytania będzie zbiór pusty. W naszym przypadku jest to porównanieId <> NULL
- wynik to 'unkown'.