执行此查询的不同方法?
我很努力地找到有效的方法来执行以下问题。执行此查询的不同方法?
我有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
用于我需要的其他数据。
我的问题是:我想知道是否有不同的方式来做这个查询(更有效率)? (现在它有一些性能自动时间问题)
你现有的查询不会重新转动你想要的数据集 - 相反,它会返回所有的任务记录。
相反,尝试:
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
如何:
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
这个查询花了大约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)
此查询不工作:/ – 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)
希望这有助于
这个查询花了我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
我很困惑,这个查询大约需要3秒来执行,(与我的查询相同),但我的查询调用同一个表)两次。 – 2013-02-12 11:31:31