2012-02-09 14 views
7

Ponieważ podobno wszyscy nie cierpią selekcji podrzędnych, chciałbym to zrobić za pomocą złączeń.Oracle SQL - Korzystanie z łączenia w celu znalezienia wartości w jednej tabeli, a nie innej

Dla niewiarygodnie contrived przykład, weźmy dwie tabele, jedną z listy numerów od 1-6, a jedną z listy liczb parzystych od 0-8. Następnie moim celem byłoby wyprowadzenie wszystkich liczb nieparzystych z tabeli Liczby.

Table Nums 
Number 
One 
Two 
Three 
Four 
Five 
Six 

Table Even 
Number 
Zero 
Two 
Four 
Six 
Eight 

Gdybym tylko chciał, aby uzyskać listę numerów, które są nawet w Nums, zrobiłbym ...

select nums.number 
FROM nums, 
    even, 
where nums.number = even.number; 

Ale, w jaki sposób mogę korzystać z tych tabel, aby uzyskać listę brak wieczności w tabeli Liczby? Lub, innymi słowy, coś jak ...

select nums.number 
from nums 
where nums.number not in (select number from even); 

Odpowiedz

12

obsługę żądań są w porządku, gdy stosowane odpowiednio ... „ktoś nie lubi czegoś” sam nie jest wystarczająco dobry powód, IMHO.

Istnieje kilka opcji - tylko 2 jako przykłady:

SELECT nums.number FROM nums 
LEFT OUTER JOIN even ON even.number = nums.number 
WHERE even.number IS NULL 

LUB

SELECT nums.number FROM nums 
MINUS 
SELECT even.number FROM even 
+1

@Jeremy Jeśli kiedykolwiek będziesz musiał to zrobić z SQL Server, użyj EXCEPT, który jest tym samym co MINUS dla Oracle. – Yahia

3

dla Oracle:

select nums.number 
    FROM nums, 
     even 
where nums.number = even.number(+) 
    and even.number is null; 

dla ANSI SQL:

SELECT nums.number 
    FROM nums LEFT OUTER JOIN even ON nums.number = even.number 
WHERE even.number IS NULL; 
+0

Dziękuję za składnię oracle. Nadal nie wiem, jak odczytać drugą składnię. – Jeremy

+1

Ansi SQL działa również na Oracle, oprócz tego działa również na innych DB. Proponuję użyć drugiej, ponieważ nie jest ona specyficzna dla danego dostawcy, jeśli twój DB zmieni twój sql nadal będzie działał, jednak jeśli użyjesz specyficznych dla Oracle instrukcji sql, może zajść konieczność przejrzenia twojego kodu podczas zmiany DB. – dursun

Powiązane problemy