2014-01-06 2 views
1

У меня есть три таблицы.Динамическое соединение таблицы по значению столбца

1) животных

идентификатор | тип | 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 

Вышеуказанные коды образца, как я хочу получить. Я хочу динамически присоединяться только к другой таблице, зависит от значения столбца основной таблицы. Если типа = 0, я хочу присоединиться только Land_Animal таблицу и если типа = 1 Я только хочу, чтобы присоединиться к Air_Animal таблицы. Как я могу это достичь? Не рекомендуется изменять структуру таблицы. Как я описал, «... выше кодов является образцом для моих проблем.«

Спасибо заранее, и я бы очень оценил ваши предложения.

+0

мечение ** Ibatis ** Тег означает, что я могу использовать по Ibatis технологии: как если это возможно. Если есть все равно, чтобы получить его ibatis, пожалуйста, посоветуйте мне терпеливо. – Cataclysm

+0

У меня нет права редактировать структуру таблицы в нашем проекте. – Cataclysm

+0

в основном я хочу получить ** название ** колонка! – Cataclysm

ответ

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

да, вы правы! ваш ответ исправит мою проблему. Благодарю. – Cataclysm

+0

Я думаю, что проверка с ** ИЛИ ** также исправить .. но я не уверен, как это понять :) – Cataclysm

+0

Есть ли какой-нибудь шанс использовать оператор CASE здесь? – amilaishere

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 демо

+0

извините, сэр, я могу принять только один ответ, но ваш код также очень полезен для меня. Заранее спасибо . Приятного дня сэр. – Cataclysm

+0

... и спасибо за прекрасный ответ. – Cataclysm

+1

Вы более чем рады. :) – peterm

Смежные вопросы