Left Join, который всегда содержит нулевые записи - PullRequest
9 голосов
/ 28 декабря 2010

Я использую Oracle 11gR2 и пытаюсь написать запрос, который возвращает адресные данные из двух таблиц CUSTOMERS и LOCATIONS. Данный клиент может (или не может) иметь разные местоположения, каждое со своим адресом.

Я хотел бы вернуть адрес для каждого клиента и все его местоположения. Например, если таблицы содержали такие данные, как:

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

LOCATIONS
CUSTOMER_ID   LOCATION_ID    ADDRESS
    1             1        "New Jersey"

Тогда я хочу, чтобы результаты выглядели так:

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

Моя первая мысль была примерно такой:

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)

Проблема в том, что когда у клиента есть местоположения, он не возвращает строку с нулевыми значениями для данных местоположения, поэтому я не получаю строку с адресом в таблице CUSTOMERS. Это дает мне что-то вроде этого:

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

Отсутствует адрес 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)

Но он дал мне те же результаты, что и первый запрос. Есть ли способ вернуть пустую запись для второй таблицы, даже если в условии соединения есть совпадение?

Ответы [ 3 ]

11 голосов
/ 28 декабря 2010

Вам не нужно присоединяться здесь вообще:

SELECT  customer_id, NULL AS location_id, address
FROM    customers
UNION ALL
SELECT  customer_id, location_id, address
FROM    locations
1 голос
/ 16 ноября 2015

Если вы хотите объединить две таблицы даже в случае несоответствия, вам нужно будет использовать IS NULL в ваших соединенных столбцах.

Например.

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

Это вернет результаты с NULL

0 голосов
/ 28 декабря 2010

Вы можете попробовать полное внешнее соединение. Например:

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)
...