执行此查询的不同方法?

问题描述:

我很努力地找到有效的方法来执行以下问题。执行此查询的不同方法?

我有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

我想要一个查询,将表明,需要有事件列表以下规则一个

无论事件是相事件有个任务(不必须相)

我当前的查询是:

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用于我需要的其他数据。

我的问题是:我想知道是否有不同的方式来做这个查询(更有效率)? (现在它有一些性能自动时间问题)

你现有的查询不会重新转动你想要的数据集 - 相反,它会返回所有的任务记录。

相反,尝试:

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 
+0

我很困惑,这个查询大约需要3秒来执行,(与我的查询相同),但我的查询调用同一个表)两次。 – 2013-02-12 11:31:31

如何:

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 
+0

这个查询花了大约10秒钟,进行了(而我的查询耗时约3秒) – 2013-02-12 10:52:36

如何

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) 
+0

此查询不工作:/ – 2013-02-12 11:01:36

试试这个

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

希望这有助于

+0

这个查询花了我53秒(!),而我的查询花了我大约3秒 – 2013-02-12 10:55:24

也许这一个:

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 
+0

这个查询不起作用(我只得到一行数据):S – 2013-02-12 10:53:40

+0

你确定,你做的一切都对吗?我已经在我自己的桌子上张贴之前检查了这一张。它将所有事件与l1.Event_IsPhase = 1,然后它从由Event_ID连接的任务中取出前1,或者如果它为空则返回NULL,并且结果由WHERE l2.par IS NOT NULL过滤。 – Alex 2013-02-12 11:12:08

+0

如果有可能,你可以发布所有答案的时间结果 – Alex 2013-02-12 11:12:40