Как заполнить значения NULL значениями из другой таблицы с помощью UNION

Мне нужно написать оператор выбора, который отображает orderId и адрес доставки из одной таблицы, но если адреса доставки нет, он должен отображать платежный адрес клиента. Я не уверен, как это сделать, поскольку UNION требует одинакового количества столбцов.

Это две таблицы:

CREATE TABLE CUSTOMER (
CustId number(4) NOT NULL,
CFirstName varchar2(30),
CSurname varchar2(30),
BillingAddr varchar2(30),
Gender varchar2(1),
PRIMARY KEY (CustId),
CONSTRAINT Check_CGender
CHECK (CGender IN ('M' , 'F'))
);

CREATE TABLE SHOPORDER (
OrdId number(4) NOT NULL,
DeliveryAddress varchar2(30),
CustId number(4),
SpId number(4),
PRIMARY KEY (OrdId),
CONSTRAINT FK_CustId
FOREIGN KEY (CustId) REFERENCES CUSTOMER,
CONSTRAINT FK_SpId
FOREIGN KEY (SpId) REFERENCES SALESPERSON
);

И это формулировка вопроса: используйте предложение UNION для перечисления идентификатора и адреса каждого заказа. Список должен быть в восходящей последовательности идентификаторов заказов. Если адрес доставки Shop Order равен NULL, вы должны отобразить платежный адрес клиента вместо адреса доставки.

Любая помощь будет очень признательна.

Мои текущие попытки, лол

SELECT Ordid, DeliveryAddress
FROM SHOPORDER
UNION
SELECT NULL AS CustId, BillingAddr
FROM CUSTOMER;


SELECT S.OrdId, S.DeliveryAddress
FROM SHOPORDER S
UNION
SELECT S.OrdId, C.BillingAddr
FROM CUSTOMER C
INNER JOIN SHOPORDER S
ON C.CustId = S.CustId;

SELECT S.OrdId 
FROM SHOPORDER S
INNER JOIN CUSTOMER C
ON S.CustId = C.CustId;
(SELECT DeliveryAddress 
FROM SHOPORDER 
UNION 
SELECT BillingAddr 
FROM CUSTOMER );

SELECT OrdId, DeliveryAddress
FROM SHOPORDER
UNION
SELECT BillingAddr
FROM CUSTOMER;

SELECT OrdId, (SELECT DeliveryAddress
FROM SHOPORDER
UNION
SELECT BillingAddr
FROM CUSTOMER)
FROM SHOPORDER;

person Liam    schedule 12.08.2020    source источник
comment
Вы сами пробовали написать запрос? Лучший способ выучить SQL — использовать его.   -  person Tim Biegeleisen    schedule 12.08.2020
comment
почему бы просто не присоединиться к заказу клиента, используя CustId?   -  person Smurphy0000    schedule 12.08.2020
comment
Попробуйте выполнить объединение заказов с адресом доставки и заказов без адреса доставки.   -  person Hernán Alarcón    schedule 12.08.2020
comment
левое соединение с таблицей клиентов и укажите if(DeliveryAddress not null, DeliveryAddress, BillingAddr)   -  person mangusta    schedule 12.08.2020


Ответы (1)


Вы ищете LEFT JOIN и COALESCE():

select so.OrdId, coalesce(so.DeliveryAddress, c.BillingAddr) as address
from shoporder so left join
     customer c
     on so.CustId = c.CustId;
person Gordon Linoff    schedule 12.08.2020