Mik*_*ike 10 sql oracle null join left-join
我使用的Oracle 11gR2,我试着写两个表中返回地址数据的查询,CUSTOMERS和LOCATIONS.给定客户可能(或可能不)具有不同的位置,每个位置具有其自己的地址.
我想为每位客户及其所有位置返回地址.例如,如果表包含如下数据:
顾客
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)
| 归档时间: |
|
| 查看次数: |
4802 次 |
| 最近记录: |