Сгруппировать таблицу дважды - на двух разных столбцах одной таблицы

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

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?

Ответ 1

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 по той же причине: неясно, гарантирована ли ссылочная целостность - и может ли любой из столбцов ключа быть NULL. [INNER] JOIN удаляет строки из результата, где совпадение не найдено. Я предполагаю, что вы предпочитаете отображать такие строки со значением NULL для любых отсутствующих x или y.

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

Ответ 2

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

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=...

Ответ 3

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'