如何使用中间表在2个表上应用外连接?

时间:2012-02-01 04:28:48

标签: mysql join

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 个答案:

答案 0 :(得分:3)

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 :(得分:1)

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;  

答案 2 :(得分:-1)

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两次。