2012-06-14 3 views
3

Мне нужна помощь на стороне базы данных sql. И у меня естьCASE для соединения таблиц sql

таблица 1: ENTITY_TYPE

entity_type_id entity_name 
    1   Task 
    2   Page 
    3   Project 
    4   Message 
    5   User 

и таблица 2: MESSAGE, который содержит сообщение от каждого значений сущностей как

message_id entity_type owner_tableid message 
    1   1    12  A message on task level 
    2   3    14  A message on project level 

и я хочу выбрать эти сообщения в соответствии с каждым типом объекта и детали из таблицы его владельца с использованием «owner_tableid», например запроса ...

select * from MESSAGE JOIN 
case entity_type when 1 then taskTable 
when 2 then pageTable 
when 3 then projectTable 
when 4 then MessageTable 
when 5 then UserTable 

Это лучший способ решить эту проблему на одной процедуре. Есть идеи ?? Теперь я использую IF условие для каждого объекта ...

ответ

4

Вы не можете параметризовать таблицы , участвующих в запросе (поэтому вы не можете поместить имя таблицы в переменную и ожидать, что это будет использоваться).

Один из способов сделать это, как цепь слева присоединяется:

select 
    * /* TODO - Pick columns */ 
from 
    MESSAGE m 
     left join 
    taskTable tt 
     on 
     m.entity_type = 1 and 
     m.owner_entity_id = tt.id 
     left join 
    pageTable pt 
     on 
     m.entity_type = 2 and 
     m.owner_entity_id = pt.id 
     left join 
    projectTable prt 
     on 
     m.entity_type = 3 and 
     m.owner_entity_id = prt.id 
     left join 
    MessageTable mt 
     on 
     m.entity_type = 4 and 
     m.owner_entity_id = mt.id 
     left join 
    UserTable ut 
     on 
     m.entity_type = 5 and 
     m.owner_entity_id = ut.id 

Если вы хотите значения из этих таблиц появятся в одном столбце в результате, используйте COALESCE через все значения, например

COALESCE(tt.Value,pt.Value,prt.Value,mt.Value,ut.Value) as Value 
+0

Я только один, который находит этот макет трудно читать? Это похоже на попытку прочитать код, написанный на головоломке Jenga. +1, потому что решение является жизнеспособным ответом; просто очень трудно читать. – Thomas

+0

Мне нравится это решение. Но, если существует много типов сущностей, мы хотим создать очень большой запрос. Если есть какой-либо простой способ использования view, pivot ... и т. Д. В запросе. –

0

Если вам нужно возвратить несколько entity_types деталей в одном запросе, чем UNION может помочь:

SELECT interesting_columns FROM Message 
JOIN pageTable ON (joinPredicate) 
WHERE entity_type = 1 

UNION ALL 

SELECT interesting_columns FROM Message 
JOIN pageTable ON (joinPredicate) 
WHERE entity_type = 2 

-- ... 

Но если вам нужно только детали определенной ENTITY_TYPE чем вы оригинальное решение с IF было бы намного лучше.

0
Select ... 
From Message 
    Join (
      Select 1 As entity_type, id 
      From taskTable 
      Union All 
      Select 2, id 
      From pageTable 
      Union All 
      Select 3, id 
      From projectTable 
      Union All 
      Select 4, id 
      From messageTable 
      Union All 
      Select 5, id 
      From userTable 
      ) As Z 
     On Z.entity_type = Message.entity_type 
      And Z.id = Message.owner_tableid 
1

Использование Союза Статья с индивидуальным ENTITY_TYPE

SELECT * FROM Message 
JOIN pageTable ON .... 
WHERE entity_type = 1 

UNION ALL 
.......... 
entity_type = 2 

UNION ALL 
.......... 
entity_type = 3 
Смежные вопросы