Sql 总是包含空记录的左连接
我使用的是Sql 总是包含空记录的左连接,sql,oracle,join,null,left-join,Sql,Oracle,Join,Null,Left Join,我使用的是oracle11gr2,我试图编写一个查询,返回两个表中的地址数据,CUSTOMERS和LOCATIONS。给定的客户可能(也可能不)有不同的位置,每个位置都有自己的地址 我想返回每个客户的地址,以及他们的所有位置。例如,如果表包含以下数据: 问题是,当客户确实有位置时,它不会为位置数据返回一个带有空值的行,因此我不会在客户表中得到一个带有地址的行。它给了我这样的东西: CUSTOMERS CUSTOMER_ID ADDRESS 1 "New York"
oracle11gr2
,我试图编写一个查询,返回两个表中的地址数据,CUSTOMERS
和LOCATIONS
。给定的客户可能(也可能不)有不同的位置,每个位置都有自己的地址
我想返回每个客户的地址,以及他们的所有位置。例如,如果表包含以下数据:
问题是,当客户确实有位置时,它不会为位置数据返回一个带有空值的行,因此我不会在客户
表中得到一个带有地址的行。它给了我这样的东西:
CUSTOMERS
CUSTOMER_ID ADDRESS
1 "New York"
2 "California"
LOCATIONS
CUSTOMER_ID LOCATION_ID ADDRESS
1 1 "New Jersey"
但它给了我与第一个查询相同的结果。即使联接条件中存在匹配项,是否有方法为第二个表返回空记录?此处根本不需要联接:
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)
您可以尝试完全外部联接。例如: CUSTOMER_ID LOCATION_ID ADDRESS 1 1 "New Jersey" 2 "California"
如果即使在不匹配的情况下也要联接这两个表,则需要在联接的列上使用
is NULL
比如说
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)
这将返回带有
NULL
的结果,在customerID和addressDoh上尝试完全外部联接。我觉得我错过了一些简单的事情。谢谢。@Mike:不客气。如果有用的话,请不要忘记更新此帖子并将其标记为已接受。这将给出与我第一次查询相同的结果(在客户中没有匹配客户的位置没有记录)。
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)
SELECT customer_id, NULL AS location_id, address
FROM customers
UNION ALL
SELECT customer_id, location_id, address
FROM locations
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)
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