Объединить таблицу дважды-по двум разным столбцам одной таблицы


У меня есть очень запутанная база данных с таблицей, которая содержит два значения, которые мне нужны в отдельной таблице. Вот мой вопрос:

Table1
- id

Table2
- id
- table1_id
- table3_id_1
- table3_id_2

Table3
- id
- value

Мне нужно перейти от таблицы 1 и выполнить соединение, которое вернуло бы мне значение из table3 в двух отдельных столбцах. Поэтому я хочу что-то вроде этого:

table1.id | table2.id | table2.table3_id_1 | table2.table3_id_2 | X | Y

Где X и Y - значения для строки, связанной соответственно table3_id_1 и table3_id_2.

Возможно, сделать их переменными или чем-то таким, чтобы я мог фильтровать их в предложении WHERE?

3 14

3 ответа:

SELECT t2.table1_id
     , t2.id          AS table2_id
     , t2.table3_id_1
     , t2.table3_id_2
     , t31.value      AS x
     , t32.value      AS y
FROM   table2 t2
LEFT   JOIN table3 t31 ON t31.id = t2.table3_id_1
LEFT   JOIN table3 t32 ON t32.id = t2.table3_id_2;
Нет необходимости присоединяться к table1. table2 имеет все, что вам нужно, - предполагая, что существует ограничение внешнего ключа, гарантирующее ссылочную целостность (все t2.table1_id фактически присутствуют в table1). В противном случае вы можете присоединиться к table1, выбрав таким образом только строки, присутствующие в table1.

Я использую LEFT [OUTER] JOIN (и нет [INNER] JOIN) чтобы присоединиться к обоим экземплярам table3 по сходной причине: неясно, гарантируется ли ссылочная целостность - и является ли какой-либо из ключей столбцы могут быть пустыми. [INNER] JOIN будет отбрасывать строки из результата, где не найдено совпадение. Я предполагаю, что вы предпочтете отображать такие строки со значением NULL для любого отсутствующего x или y.

И table3.id должны быть UNIQUE, или мы могли бы умножить строки с несколькими совпадениями из каждого LEFT JOIN:

Если вы соединяете таблицу несколько раз, используйте псевдонимы, чтобы различать их:

SELECT table1.id,table2.id,table2.table3_id_1,table2.table3_id_2,t3_1.id,t3_2.id
FROM table1
JOIN table2 ON table1.id=table2.table1_id
JOIN table3 t3_1 ON table2.table3_id_1=t3_1.id
JOIN table3 t3_2 ON table2.table3_id_2=t3_2.id
WHERE ... t3_1.id=... AND ... t3_2.id=...
select t1.id as table1_id, 
    t2.id as table2_id, 
    t2.table3_id_1, 
    t2.table3_id_2,
    t3_1.value as X, 
    t3_2.value as Y
from Table1 t1
inner join Table2 t2 on t1.id = t2.table1_id
inner join Table3 t3_1 on t2.table3_id_1 = t3_1.id
inner join Table3 t3_2 on t2.table3_id_2 = t3_2.id
where t3_1.value = 'some_value'
    or t3_2.value = 'some_other_value'