Kategoria: SQL Dodane przez marcin90

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ź

1 0 Dodane 10-06-2018 przez marcin90
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)

Dodaj swoją wersję odpowiedzi

Dodajesz odpowiedź jako gość. Zaloguj się się by uzyskać dostęp do rankingu oraz powiadomień.