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ę.

1 odpowiedź

Rezultatem powyższego zapytania będzie zbiór pusty.

Uzasadnienie
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ównanie Id <> NULL - wynik to 'unkown'.

By zapytanie działo poprawnie w podzapytaniu w klauzuli WHERE powinniśmy użyć warunku IS NOT NULLZapytanie powinno wyglądać następująco:
SELECT *
FROM Vehicle 
WHERE Id NOT IN (SELECT VehicleId FROM VehiclePrice WHERE VehicleId IS NOT NULL)

Zaloguj się lub zarejestruj by dodać odpowiedź.


© 2018 - SkillsTest.pl | | Regulamin | Polityka Prywatnosci