Необязательный JOIN в SQL

У меня есть родительская device таблица, а также таблица division. Между ними находятся таблицы stop и ctrltab, каждая из которых имеет свойства device_id, соответствующие device, например, pipe_division_id, который подключается к таблице pipe_division. Обновлено: по запросу я добавил примеры таблиц ниже

Таблица устройств

device_id | name   | board_number 
--------------------------------
23         Stop1    10
24         Stop2    11
25         Ctrltab1 11
26         Rand_dev 8 

Остановить стол

device_id | label        | pipe_division_id | length
23          Stop1: Piano   305                16
24          Stop2: Buffet  306                16

Таблица Ctrltab

device_id | label    | pipe_division_id | ctrl_function
25          Ctrltab1     305              open_window 

Таблица разделения труб

pipe_division_id | label     | position
305                Lower Box    underneath the stairs
306                Upper Box    above the stairs
307                Side Box     To the left of the console in the closet

Ожидаемый результат запроса:

name   | board_number | label
Stop1    10             Lower Box
Stop2    11             Upper Box
Ctrltab1 11             Lower Box

По сути, я хотел бы выбрать все устройства в таблице device с номером платы выше 10, у которых есть pipe_division_id, который можно найти, соединив их таблицы stop или ctrltab.

Я пытался

Select name, board_number, pd.label 
from device d 
JOIN stops s ON s.device_id = d.device_id 
JOIN ctrltab ct ON ct.device_id = d.device_id 
JOIN pipe_division_id pd ON (s.pipe_division_id = pd.pipe_division_id 
                         OR ct.pipe_division_id = pd.pipe_division_id)

но это не дает никаких результатов, я полагаю, что это утверждение ИЛИ недействительно? Я бы предпочел избегать объединения, так как реальный запрос очень длинный, и я не хотел бы повторять весь этот текст только для незначительной разницы в поиске метки pipe_division.

🤔 А знаете ли вы, что...
SQL был создан в 1970-х годах компанией IBM.


1
59
1

Ответ:

Решено
SELECT d.name, d.board_number, COALESCE(pd1.label, pd2.label) AS label
FROM device d
LEFT JOIN stop s ON s.device_id = d.device_id
LEFT JOIN pipe_division pd1 ON s.pipe_division_id = pd1.pipe_division_id
LEFT JOIN ctrltab ct ON ct.device_id = d.device_id
LEFT JOIN pipe_division pd2 ON ct.pipe_division_id = pd2.pipe_division_id
WHERE d.board_number > 10;

Дбфиддл