Мне нужна помощь во избежание присоединения к одной и той же таблице несколько раз. Вот мой пример запроса.
Таблица 1 имеет 3 столбца ABC_ID, DEF_ID, XYZ_ID и связана с таблицей 2 в столбце идентификатора. 3 значения столбца в table1 могут быть нулевыми, и если значения присутствуют, тогда мне нужно вернуть соответствующее значение из таблицы 2, используя разные имена столбцов, как в операторе select.
Поскольку я использую левое соединение, я в итоге трижды присоединился к таблице 2 с таблицей 1 для каждого типа, если в столбце идентификатора много проблем с производительностью. Как я могу написать это по-другому, чтобы избежать объединения несколько раз. Вот пример данных. Любая помощь приветствуется
select
(
CASE
WHEN ( table2.ID = table1.ABC_ID)
THEN table2.ID_VAL
ELSE 'TEST1'
END ) AS "TEST1",
(
CASE
WHEN (table2a.ID = table1.DEF_ID)
THEN table2a.ID_VAL
ELSE 'TEST2'
END ) AS "TEST2",
(
CASE
WHEN (table2b.ID = table1.XYZ_ID)
THEN table2b.ID_VAL
ELSE 'TEST3'
END ) AS "TEST3"
from table1 table1
left join table2 table2 on (table2.ID=table1.ABC_ID)
left join table2 table2a on ( table2a.id=table1.DEF_ID)
left join table2 table2b on ( table2b.id=table1.XYZ_ID)
where table1.Id_NUM='1'
Таблица 1
Id_NUM ABC_ID DEF_ID XYZ_ID
1 12345 456789 32145
2 null 456789 32145
3 12345 null null
Таблица 2
ID ID_VAL
12345 abcded
456789 kjwsddk
321456 wedfgfv
ВЫХОД
TEST1 TEST2 TEST3
12345 456789 32145
Ваше join
в порядке, но запрос может быть упрощен:
select coalesce(t2a.ID_VAL, 'TEST1') as test1,
coalesce(t2d.ID_VAL, 'TEST2') as test2,
coalesce(t2x.ID_VAL, 'TEST3') as test3
from table1 t1 left join
table2 t2a
on t2a.ID = t1.ABC_ID left join
table2 t2d
on t2d.id = t1.DEF_ID left join
table2 t2x
on t2x.id = t1.XYZ_ID
where t1.Id_NUM = 1;
Заметки:
id_num
является числом, поэтому не используйте одинарные кавычки для значения.case
могут быть заменены на coalesce()
, что проще (это не совсем то же самое, если id_val
может быть NULL
, но я предполагаю, что этого не происходит).Нет причин избегать трехкратного присоединения к столу. Это то, чего требует ваша модель данных, потому что у вас есть три отдельные ссылки на внешние ключи.