我希望能提供一些帮助,帮助我改进下面的查询,这个问题需要一个绝对的年龄来执行。
我知道LEFT JOIN
导致语句运行得如此缓慢,但我不知道如何运行查询以提高性能并返回所需的结果。
查询
SELECT
s.id, s.first_name, s.last_name, COUNT(a.AbsenceId)
FROM ((
dbo_ds_staff AS s
INNER JOIN dbo_ds_team_staff_member AS tsm ON s.id=tsm.staff_id
)
INNER JOIN dbo_ds_team_leader AS tl ON tsm.team_id=tl.team_id
)
LEFT JOIN ct_adt_Absence AS a ON s.id=a.StaffId
WHERE
tl.staff_id=2169
And tsm.start_date<NOW()
And (
tsm.end_date>=NOW()
Or tsm.end_date Is Null
)
And tl.start_date<NOW()
And (
tl.end_date>=NOW()
Or tl.end_date Is Null
)
GROUP BY s.id, s.first_name, s.last_name
ORDER BY s.first_name, s.last_name;
如果有任何进一步的信息我可以提供帮助,请告诉我!感谢
答案 0 :(得分:2)
正如对问题的评论中所建议的那样,Access中的传递查询可能会通过将SQL Server表的处理推送到SQL Server本身来加快速度。例如,带有SQL
的名为[ptqStaffList]的传递查询SELECT
s.id, s.first_name, s.last_name
FROM
dbo.ds_staff AS s
INNER JOIN
dbo.ds_team_staff_member AS tsm
ON s.id=tsm.staff_id
INNER JOIN
dbo.ds_team_leader AS tl
ON tsm.team_id=tl.team_id
WHERE tl.staff_id=2169
AND tsm.start_date < CURRENT_TIMESTAMP
AND (tsm.end_date >= CURRENT_TIMESTAMP OR tsm.end_date IS NULL)
AND tl.start_date < CURRENT_TIMESTAMP
AND (tl.end_date >= CURRENT_TIMESTAMP OR tl.end_date IS NULL)
...在Access ...中看起来像这样......
...返回:
id first_name last_name
-- ---------- ---------
1 Gord Thompson
然后我们可以在常规SELECT查询中使用它与本地Access表
SELECT
s.id,
s.first_name,
s.last_name,
COUNT(a.AbsenceId) AS AbsenceCount
FROM
ptqStaffList AS s
LEFT JOIN
ct_adt_Absence AS a
ON s.id=a.StaffId
GROUP BY s.id, s.first_name, s.last_name
ORDER BY s.first_name, s.last_name;
返回
id first_name last_name AbsenceCount
-- ---------- --------- ------------
1 Gord Thompson 1
答案 1 :(得分:1)
SELECT s.*, COUNT(a.AbsenceId)
FROM
(SELECT s.id, s.first_name, s.last_name
FROM ((dbo_ds_staff AS s
INNER JOIN dbo_ds_team_staff_member AS tsm ON s.id=tsm.staff_id)
INNER JOIN dbo_ds_team_leader AS tl ON tsm.team_id=tl.team_id)
WHERE tl.staff_id=2169 And tsm.start_date<NOW() And (tsm.end_date>=NOW() Or tsm.end_date Is Null) And tl.start_date<NOW() And (tl.end_date>=NOW() Or tl.end_date Is Null)
GROUP BY s.id
ORDER BY s.first_name, s.last_name) as s
LEFT JOIN ct_adt_Absence AS a ON s.id=a.StaffId
GROUP BY s.id
我会首先选择用户,然后添加LEFT JOIN以计算缺席。
另外,我不知道为什么需要first_name和last_name
进行分组