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


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)
MarekKotowski 13-09-2021 03:17
Można wykorzystać not exists select * from Vehicle where not exists (select id from VehiclePrice where VehicleId = Vehicle.id)


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