2012-02-09 17 views
7

Porque aparentemente todo el mundo odia las sub selecciones, me gustaría hacer esto usando las uniones.Oracle SQL - Usando combinaciones para encontrar valores en una tabla, y no en otra

Para un ejemplo increíblemente artificial, tome dos tablas, una con una lista de números del 1 al 6 y una con una lista de números pares del 0 al 8. Entonces, mi objetivo sería dar salida a todos los números impares en la tabla Nums.

Table Nums 
Number 
One 
Two 
Three 
Four 
Five 
Six 

Table Even 
Number 
Zero 
Two 
Four 
Six 
Eight 

Si sólo quería obtener la lista de los números pares que se encuentran en Nums, lo haría ...

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

Pero, ¿cómo puedo usar estas tablas para obtener la lista de no pares en la mesa Nums? O, en otras palabras, algo así como ...

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

Respuesta

12

subselects están bien cuando se usa apropiadamente ... "alguien no le gusta algo" por sí sola no es una razón suficiente en mi humilde opinión.

Hay varias opciones - simplemente como ejemplos: 2

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 Si alguna vez necesita hacer eso con SQL Server, utilice EXCEPT, que es lo mismo que MINUS for Oracle. – Yahia

3

para Oracle:

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

para ANSI SQL:

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

Gracias por la sintaxis de Oracle. Todavía no sé cómo leer la otra sintaxis. – Jeremy

+1

ansi SQL también funciona en Oracle, además de que también funciona en otros DB. Le ofrezco utilizar el segundo porque no es específico del proveedor, si su base de datos cambia, su sql seguirá funcionando; sin embargo, si usa sentencias SQL específicas de Oracle, es posible que necesite revisar su código mientras cambia DB. – dursun

Cuestiones relacionadas