У меня есть родительская 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.
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;