Question

I have three tables.

1) Animal

id | type | animal_id

2) Land_Animal

animal_id | name

3) Air_Animal

animal_id | name

type = (0 , land_Animal ; 1 , air_Animal )

I would like to retreive as ...

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

The above codes are sample as I want to get. I want to dynamically join only another table depends on column value of main table. If type = 0 , I want to join only Land_Animal table and if type = 1 I only want to join Air_Animal table. How can I achieve it ? Don't be suggested to edit my table structure. As I described "...above codes are sample for my problems."

Thanks in advance and I would really appreciated your suggestions.

Was it helpful?

Solution

Use following query

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 

OTHER TIPS

You can do it with JOINs this way

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

or

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

Sample output:

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

Here is SQLFiddle demo

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top