У меня есть 2 стола. Таблица 1:
ID, ReceiveID, ProcessID, DeliverID
1 1 1
2 1 2 3
3 3
Таблица 2:
ID, Name
1 Jack
2 Mary
3 Paul
Я хочу получить:
Table1ID, Receiver, Processor, Delivered
1 Jack Jack
2 Jack Mary Paul
3 Paul
Может ли кто-нибудь помочь мне построить запрос?
Я пытался:
SELECT a.Table1ID, b.name, bb.name, bc.name
FROM Table1 as a
JOIN Table2 as b ON a.ReceiveID = b.ID
JOIN Table2 as bb ON a.ProcessID = b.ID
JOIN Table2 as bc ON a.DeliverID = b.ID
но не сработало.
Вы должны использовать левое соединение, чтобы разрешить сохранение строк, даже если какой-либо идентификатор равен нулю:
select tab1.id, rec.name, proc.name, delv.name
from tab1
left join tab2 rec on tab1.receive_id = rec.id
left join tab2 proc on tab1.process_id = proc.id
left join tab2 delv on tab1.deliver_id = delv.id
SELECT
a.ID AS Table1ID,
COALESCE(b.Name, '') AS Receiver,
COALESCE(bb.Name, '') AS Processor,
COALESCE(bc.Name, '') AS Delivered
FROM Table1 a
LEFT JOIN Table2 b ON a.ReceiveID = b.ID
LEFT JOIN Table2 bb ON a.ProcessID = bb.ID
LEFT JOIN Table2 bc ON a.DeliverID = bc.ID;
Этот краткий запрос дает тот же результат, сопоставляя идентификаторы с именами и обрабатывая пропущенные значения. Это решит вашу проблему.
Зачем использовать
COALESCE
и заменятьNULL
пустой строкой? Я действительно сомневаюсь, что это задумано, почему кто-то должен это делать? Некоторые инструменты и СУБД, например Oracle, даже обрабатывают пустые строки какNULL
.