有条件的联接表

时间:2018-08-07 05:02:45

标签: mysql sql

我有3个表,假设Table1,Table2和Table3.i必须根据条件将Table1与Table2或Table3连接起来。

|------------|---------------|
|      id    |  Name         |
|------------|---------------|
|      1     |  facebook     |
|------------|---------------|
|      2     |  twitter      |
|------------|---------------|

|------------|---------------|-------------|
|      id    |  tab1_id      |   value     |
|------------|---------------|-------------|
|      1     |  1            |    val1     |
|------------|---------------|-------------|
|      2     |  2            |    val3     |
|------------|---------------|-------------|


|------------|---------------|-------------|
|      id    |  tab1_id      |   value     |
|------------|---------------|-------------|
|      1     |  1            |    val5     |
|------------|---------------|-------------|
|      2     |  2            |    val6     |
|------------|---------------|-------------|

DDL:

create table tbl1 (id int,  Name varchar(10));
insert into tbl1 values
(1,'facebook'),
(2,'twitter');

create table tbl2 (id int,tab1_id int,  value varchar(10));
insert into tbl2 values
(1,1,'val1'),
(2,2,'val3');

create table tbl3 (id int,tab1_id int,  value varchar(10));
insert into tbl3 values
(1,1 ,'val5'),
(2,2 ,'val6');

这里我需要一个联接,如果我的第一个表'Name'facebook,则表1应该与Table2联接,并且如果我的第一个表'Name'是{{1 }}表1应该与Twitter连接 我在下面的查询中尝试过

Table3

3 个答案:

答案 0 :(得分:3)

SELECT `T1`.`Name`, 
(CASE WHEN (`T1`.`Name` = 'facebook') THEN `T2`.`value` 
WHEN (`T1`.`Name` = 'twitter') THEN `T3`.`value` END) AS tab3_value 
FROM table1 T1 
LEFT JOIN table2 T2 ON (`T2`.`tab1_id` = `T1`.`id` AND `T1`.`Name` = 'facebook') 
LEFT JOIN table3 T3 ON (`T3`.`tab1_id` = `T1`.`id` AND `T1`.`Name` = 'twitter') ;

您可以尝试上述查询吗,我对该查询进行了测试。

Here is a Demo

答案 1 :(得分:1)

尝试此查询:

select *,
       case when name = 'facebook' then
         (select value from tbl2 where tab1_id = t1.id)
       else
         (select value from tbl3 where tab1_id = t1.id)
       end value
from tbl1 t1;

答案 2 :(得分:0)

尝试此查询:

with dt
(select *, namekey='facebook' from table2
union 
select *, namekey='twitter' from table3)

select * from table1
inner join dt on table1.Name=dt.namekey