按列值动态表连接

时间:2014-01-06 05:17:13

标签: mysql sql ibatis

我有三张桌子。

  

1)动物

     

id |类型| animal_id

     

2) Land_Animal

     

animal_id |名称

     

3) Air_Animal

     

animal_id |名称

type = (0 , land_Animal ; 1 , air_Animal )

我想继续...... ...

select * from Animal anm
if type = 0 then inner join Land_Animal land on anm.animal_id = land.animal_id
else inner join Air_Animal air on anm.animal_id = air.animal_id

以上代码是我想要的样本。我想动态加入另一个表取决于主表的列值。如果 type = 0 ,我只想加入 Land_Animal 表,如果 type = 1 我只想加入 Air_Animal 表。我怎样才能实现它?不建议编辑我的表结构。正如我所描述的那样“ ......上面的代码是我的问题的样本。

提前致谢,我非常感谢您的建议。

2 个答案:

答案 0 :(得分:2)

使用以下查询

SELECT * 
FROM   animal a 
       INNER JOIN land_animal l 
               ON l.animal_id = a.animal_id 
WHERE  a. type = 0 
UNION 
SELECT * 
FROM   animal a 
       INNER JOIN air_animal ai 
               ON ai.animal_id = a.animal_id 
WHERE  a.type = 1 

答案 1 :(得分:2)

你可以用JOIN这样做

SELECT m.*, COALESCE(l.name, a.name) name
  FROM animal m LEFT JOIN land_animal l
    ON m.type = 0
   AND m.animal_id = l.animal_id LEFT JOIN air_animal a
    ON m.type = 1
   AND m.animal_id = a.animal_id

SELECT m.*, q.name
  FROM animal m JOIN
(
  SELECT 0 type, animal_id, name
    FROM land_animal
  UNION ALL
  SELECT 1 type, animal_id, name
    FROM air_animal
) q
    ON m.type = q.type
   AND m.animal_id = q.animal_id

示例输出:

| ID | TYPE | ANIMAL_ID |  NAME |
|----|------|-----------|-------|
|  1 |    0 |         1 | horse |
|  2 |    1 |         1 |   owl |

这是 SQLFiddle 演示