Как применить внешнее объединение на 2 таблицы, используя промежуточную таблицу? - PullRequest
4 голосов
/ 01 февраля 2012
table1 | id | value
--------------------
          1 | john
          2 | frank
          3 | patel
          4 | jim

table2 | id | value
--------------------
          6 | steve
          7 | tim
          8 | sunny
          9 | bhaskar

merged | tabid1 | tabid2
------------------------------
         3      | 7
         4      | 8

Требуется вывод:

    output  | tabid1 | tabval1 | tabid2 | tabval2
              1      | john    | NULL   | NULL
              2      | frank   | NULL   | NULL
              3      | patel   | 7      | tim
              4      | jim     | 8      | sunny
              NULL   | NULL    | 6      | steve
              NULL   | NULL    | 9      | bhaskar

Я пытался:

SELECT * 
FROM table1
LEFT JOIN merged m1 ON table1.id = m1.tabid1, merged m2
RIGHT JOIN table2 ON table2.id = m2.tabid2

Но это дает 16 строк вместо необходимых 6

Ответы [ 3 ]

3 голосов
/ 01 февраля 2012
select table1.id,table1.value,table2.id,table2.value 
     from table1 left join merged on table1.id=merged.tabid1 
            left join table2 on merged.tabid2=table2.id 
union 
select table1.id,table1.value,table2.id,table2.value 
     from table2 left join merged on table2.id=merged.tabid2
     left join table1 on merged.tabid1=table1.id ;

или с правым соединением:

SELECT * FROM 
    table1 LEFT JOIN merged on table1.id=merged.tabid1 
           LEFT JOIN table2 ON merged.tabid2=table2.id  
UNION 
SELECT * FROM 
    table1 RIGHT JOIN merged on table1.id=merged.tabid1 
           RIGHT JOIN table2 ON merged.tabid2=table2.id WHERE table1.id IS NULL;
1 голос
/ 01 февраля 2012
SELECT  
       table1.id    tabid1,  
       table1.value tabvalue1,  
       table2.id    tabid2,  
       table2.value tabvalue2  
  FROM merged  
  FULL OUTER JOIN table1 ON merged.tabid1 = table1.id;  
  FULL OUTER JOIN table2 ON merged.tabid2 = table2.id;  
0 голосов
/ 01 февраля 2012
SELECT table1.id AS tabid1, table1.value AS tabval1,
       table2.id AS tabid2, table2.value AS tabval2
FROM table1
LEFT JOIN merged m1 ON table1.id = m1.tabid1
RIGHT OUTER JOIN table2 ON table2.id = m1.tabid2

Я не знаю, почему вы почувствовали необходимость присоединиться к merged дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...