我很难找到有效的方法来执行以下问题。
我有3张桌子:
保留以下数据的 1) Events
tbl:
保留以下数据的
2) Tasks
tbl:
逻辑是:
我想要一个查询,该查询将显示需要一个以下规则的事件列表:
事件是一个阶段 OR 事件有一个任务(不必是阶段)
我目前的查询是:
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
用于我需要的其他数据。
我的问题是:我想知道是否有不同的方法来执行此查询(更有效)? (现在它有一些性能时间问题)
答案 0 :(得分: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
答案 1 :(得分:1)
试试这个
select distinct E.Event_ID from Tasks T, Events E
WHERE (E.Event_ID = T.RelatedGateID) or
(E.Event_IsPhase = 1)
希望这有帮助
答案 2 :(得分: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
答案 3 :(得分: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)
答案 4 :(得分: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