2012-02-09 14 views
7

Perché a quanto pare tutti odiano i sottoselezionanti, vorrei farlo usando i join.Oracle SQL - Utilizzo di join per trovare valori in una tabella, e non un altro

Per un esempio incredibilmente forzato, prendere due tabelle, una con un elenco di numeri da 1 a 6 e una con un elenco di numeri pari da 0 a 8. Quindi, il mio obiettivo sarebbe quello di produrre tutti i numeri dispari nella tabella Nums.

Table Nums 
Number 
One 
Two 
Three 
Four 
Five 
Six 

Table Even 
Number 
Zero 
Two 
Four 
Six 
Eight 

Se volevo solo per ottenere l'elenco dei numeri pari che sono Nums, lo farei ...

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

Ma, come posso utilizzare queste tabelle per ottenere l'elenco dei Non-Evens nella tabella Nums? O, in altre parole, qualcosa di simile ...

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

risposta

12

subselect vanno bene se usato in modo appropriato ... "qualcuno non piace qualcosa" da solo non è una buona ragione sufficiente IMHO.

Ci sono diverse opzioni - solo 2 esempi:

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

O

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

@Jeremy Se è necessario farlo con SQL Server, utilizzare EXCEPT che è la stessa cosa di MINUS per Oracle. – Yahia

3

per Oracle:

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

per ANSI SQL:

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

Grazie per la sintassi di Oracle. Ancora non so leggere l'altra sintassi. – Jeremy

+1

ansi SQL funziona anche su Oracle, inoltre funziona anche su altri DB. Vi offro di utilizzare il secondo perché non è specifico del fornitore, se il vostro DB cambia il vostro sql funzionerà comunque, tuttavia se usate le istruzioni SQL specifiche di SQL potreste aver bisogno di rivedere il vostro codice durante la modifica del DB. – dursun

Problemi correlati