不同的方式来执行此查询?

时间:2013-02-12 10:00:24

标签: sql sql-server-2008 sql-server-2008-r2

我很难找到有效的方法来执行以下问题。

我有3张桌子:

保留以下数据的

1) Events tbl:

enter image description here

保留以下数据的

2) Tasks tbl:

enter image description here

逻辑是:

  • 可以将许多任务分配给事件(但事件不一定具有 任务)
  • 事件可以定义为阶段
  • events.event_id是PK,和 tasks.RelatedGateID它是他的FK
  • tasks.taskID是PK

我想要一个查询,该查询将显示需要一个以下规则的事件列表:

事件是一个阶段 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用于我需要的其他数据。

我的问题是:我想知道是否有不同的方法来执行此查询(更有效)? (现在它有一些性能时间问题)

5 个答案:

答案 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