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