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

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

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 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'

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

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

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

Two SQL LEFT JOINS produce incorrect result

Ваш ответ на вопрос