1

私は次の問題を実行するための効率的な方法を見つけるのに苦労しています。

私は3つのテーブルを持っています:

1) Events次のデータを保持するtbl:

ここに画像の説明を入力してください

2) Tasks次のデータを保持するtbl:

ここに画像の説明を入力してください

論理は次のとおりです。

  • 多くのタスクをイベントに割り当てることができます(ただし、必ずしもイベントにタスクがあるとは限りません)
  • イベントはフェーズとして定義できます
  • events.event_idはPKであり、tasks.RelatedGateIDは彼のFKです。
  • tasks.taskIDはPKです

次のいずれかのルールが必要なイベントのリストを表示するクエリが必要です。

イベントがフェーズであるか、イベントにタスクがあります(フェーズである必要はありません)

私の現在のクエリは:

SELECT DISTINCT * FROM 
(
    SELECT Event_ID FROM
    (
        SELECT 
            E.Event_ID 
        FROM
            Events E 
        WHERE E.Event_IsPhase = 1
    ) ET UNION
    (
        SELECT 
            T.RelatedGateID
        FROM
            Tasks T
    )
)AS tbl1 LEFT JOIN
Tasks AS tbl2 ON tbl1.Event_ID=tbl2.RelatedGateID

*最後LEFT JOINは私が持っている必要がある追加データ用です。

私の質問は:このクエリを(より効率的に)行う別の方法があるかどうか知りたいですか?(現在、パフォーマンス時間の問題がいくつかあります)

4

5 に答える 5

1

どうですか:

SELECT DISTINCT Event_ID
FROM Events e
LEFT JOIN Tasks t on e.Event_ID = t.RelatedGateID
WHERE e.Event_IsPhase = 1 OR t.RelatedGateID IS NOT NULL
于 2013-02-12T10:10:31.890 に答える
1

これを試して

select distinct E.Event_ID from Tasks T, Events E 
WHERE (E.Event_ID = T.RelatedGateID) or 
(E.Event_IsPhase = 1)

お役に立てれば

于 2013-02-12T10:11:55.273 に答える
1

既存のクエリは目的のデータセットを返しません。代わりに、すべてのタスクレコードを返します。

代わりに、次を試してください。

select e.Event_ID, t.*
from Events e
left join Tasks t ON e.Event_ID=t.RelatedGateID
where e.Event_IsPhase = 1 or t.RelatedGateID is not null
于 2013-02-12T10:12:05.283 に答える
0

どうですか

SELECT DISTINCT E.Event_ID  FROM Events E left outer join Tasks AS tbl2 ON tbl1.Event_ID=tbl2.RelatedGateID WHERE E.Event_IsPhase = 1 OR COUNT(tasks.taskID) > 0 GROUP BY (E.Event_ID)
于 2013-02-12T10:11:20.467 に答える
0

多分これ:

SELECT Event_ID FROM 
(
    SELECT  Event_ID,
    (select top 1 T.RelatedGateID from Tasks T where T.RelatedGateID=l1.Event_ID) as par 
    FROM Events l1 
    WHERE l1.Event_IsPhase=1
) l2 
WHERE l2.par IS NOT NULL
于 2013-02-12T10:17:21.810 に答える