3

我需要 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

4 回答 4

5

您不能参数化查询中涉及的(因此您不能将表名放在变量中并期望使用它)。

一种方法是作为左连接链:

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在所有值中使用 a,例如

COALESCE(tt.Value,pt.Value,prt.Value,mt.Value,ut.Value) as Value
于 2012-06-14T06:40:03.767 回答
1

将联合条款与您的个人 entity_type 一起使用

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

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

UNION ALL
..........
entity_type = 3
于 2012-06-14T06:43:41.460 回答
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
于 2012-06-14T06:41:30.007 回答
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会好得多。

于 2012-06-14T06:38:28.573 回答