2010-12-28 8 views
8

Estoy usando Oracle 11gR2 y estoy tratando de escribir una consulta que devuelve datos de direcciones de dos tablas, CUSTOMERS y LOCATIONS. Un cliente determinado puede (o no) tener diferentes ubicaciones, cada una con su propia dirección.Izquierda Unirse que siempre incluye registros nulos

Me gustaría devolver la dirección de cada cliente y todas sus ubicaciones. Por ejemplo, si los cuadros que figuran datos como:

 
CUSTOMERS 
CUSTOMER_ID ADDRESS 
    1   "New York" 
    2   "California"

LOCATIONS CUSTOMER_ID LOCATION_ID ADDRESS 1 1 "New Jersey"

entonces yo quiero que los resultados se ven como:

 
CUSTOMER_ID LOCATION_ID ADDRESS 
    1       "New York" 
    1    1  "New Jersey" 
    2      "California"

Mi primer pensamiento fue algo como esto:

SELECT 
CUSTOMERS.CUSTOMER_ID, 
LOCATIONS.LOCATION_ID, 
NVL(LOCATIONS.ADDRESS,CUSTOMERS.ADDRESS) ADDRESS 
FROM 
CUSTOMERS 
LEFT JOIN 
LOCATIONS ON (CUSTOMERS.CUSTOMER_ID=LOCATIONS.CUSTOMER_ID) 

El problema es que cuando un cliente tiene ubicaciones, no devuelve una fila con valores nulos para r datos de ubicación, por lo que no obtengo una fila con la dirección en la tabla CUSTOMERS. Me da algo como esto:

 
CUSTOMER_ID LOCATION_ID ADDRESS 
    1    1  "New Jersey" 
    2      "California" 

que le falta la dirección New York para customer 1. Intenté esto ...

SELECT 
CUSTOMERS.CUSTOMER_ID, 
LOCATIONS.LOCATION_ID, 
NVL(LOCATIONS.ADDRESS,CUSTOMERS.ADDRESS) ADDRESS 
FROM 
CUSTOMERS 
LEFT JOIN 
LOCATIONS ON (CUSTOMERS.CUSTOMER_ID=LOCATIONS.CUSTOMER_ID OR LOCATIONS.CUSTOMER_ID IS NULL) 

Pero me dio los mismos resultados que la primera consulta. ¿Hay alguna manera de devolver un registro nulo para la segunda tabla incluso cuando hay una coincidencia en la condición de unión?

+0

probar una combinación externa completa tanto en ID del cliente y la dirección – yurib

Respuesta

10

No es necesario unirse a una aquí en absoluto:

SELECT customer_id, NULL AS location_id, address 
FROM customers 
UNION ALL 
SELECT customer_id, location_id, address 
FROM locations 
+0

Doh. Tenía la sensación de que me estaba perdiendo algo simple. Gracias. – Mike

+0

@Mike: de nada. Si fue útil, no se olvide de votar esta publicación y marcarla como aceptada. – Quassnoi

0

Usted puede tratar de una combinación externa completa. Por ejemplo:

SELECT  
CUSTOMERS.CUSTOMER_ID, 
LOCATIONS.LOCATION_ID, 
NVL(LOCATIONS.ADDRESS,CUSTOMERS.ADDRESS) ADDRESS    
FROM CUSTOMERS 
    FULL OUTER JOIN LOCATIONS ON (CUSTOMERS.CUSTOMER_ID=LOCATIONS.CUSTOMER_ID) 
+0

Esto da los mismos resultados que mi primera consulta (no hay registros en LOCATIONS sin un cliente correspondiente en CLIENTES). – Mike

1

Si desea unir las dos tablas incluso cuando no hay un no partido, tendrá que utilizar IS NULL en sus columnas combinadas.

Por ejemplo.

Table 1: 
CustomerID 
CustomerName 

.

Table 2: 
CustomerID 
CustomerEmail 

.

Select, 
CustomerID, 
CustomerName, 
ISNULL (CustomerEmail, NULL) AS CustomerEmail 


FROM table1 

LEFT JOIN table2 
ON table1.CustomerID = table2.CustomerID 

Este Wil traer de vuelta los resultados con NULL

Cuestiones relacionadas