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

クエリに含まれるテーブルをパラメータ化することはできません(したがって、テーブル名を変数に入れて、それが使用されることを期待することはできません)。

これを行う1つの方法は、左結合のチェーンとしてです。

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
于 2012-06-14T06:40:03.767 に答える
1

個々のentity_typeでUnionClauseを使用する

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

1つのクエリで複数の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 に答える
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 に答える