左连接始终包含空记录

Mik*_*ike 10 sql oracle null join left-join

我使用的Oracle 11gR2,我试着写两个表中返回地址数据的查询,CUSTOMERSLOCATIONS.给定客户可能(或可能不)具有不同的位置,每个位置具有其自己的地址.

我想为每位客户及其所有位置返回地址.例如,如果表包含如下数据:

顾客
CUSTOMER_ID地址
    1"纽约"
    2"加州"

地点 CUSTOMER_ID LOCATION_ID地址 1 1"新泽西"

然后我希望结果看起来像:

CUSTOMER_ID LOCATION_ID地址
   1"纽约"
   1 1"新泽西"
   2"加州"

我的第一个想法是这样的:

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)
Run Code Online (Sandbox Code Playgroud)

问题在于,当客户确实有位置时,它不返回具有位值数据的空值的行,因此我没有得到CUSTOMERS表中包含地址的行.它给了我这样的东西:

CUSTOMER_ID LOCATION_ID地址
   1 1"新泽西"
   2"加州"

它错过了New York地址customer 1.我试过这个......

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)
Run Code Online (Sandbox Code Playgroud)

但它给了我与第一个查询相同的结果.有没有办法返回第二个表的空记录,即使连接条件匹配?

Qua*_*noi 12

你根本不需要加入:

SELECT  customer_id, NULL AS location_id, address
FROM    customers
UNION ALL
SELECT  customer_id, location_id, address
FROM    locations
Run Code Online (Sandbox Code Playgroud)