Объединить таблицу дважды-по двум разным столбцам одной таблицы
У меня есть очень запутанная база данных с таблицей, которая содержит два значения, которые мне нужны в отдельной таблице. Вот мой вопрос:
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 ответа:
Нет необходимости присоединяться к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'