我有以下 SQL 查询。

SELECT em.employeeid, tsi.timestamp
FROM timesheet_temp_import tsi
JOIN employee emp ON emp.employeeid = tsi.credentialnumber
WHERE
tsi.masterentity = 'MASTER' AND
tsi.timestamp NOT IN
(
    SELECT ea.timestamp
    FROM employee_attendance ea
    WHERE
    ea.employeeid = em.employeeid
    AND ea.timestamp =  tsi.timestamp
    AND ea.ismanual = 0
)
GROUP BY em.employeeid, tsi.timestamp

此查询比较导入表(带有员工时间和出勤时间戳)。

有时timesheet_temp_import有超过95,000行,而我的查询必须仅向显示雇员的时间戳,这些时间戳是。如果某个员工的时间戳已经存在,那么我必须将其排除。

查询正在运行,但耗时超过 4 分钟,所以我想知道是否可以使用其他可以帮助我减少这段时间的 NOT IN 语句来改进 ojit_code 语句。

最佳答案

使用 NOT EXISTS 可能会对您有所帮助。

SELECT
    em.employeeid,
    tsi.timestamp
    FROM timesheet_temp_import tsi
    join employee emp ON emp.employeeid = tsi.credentialnumber
    WHERE
    tsi.masterentity = 'MASTER' AND

    NOT EXISTS
    (
        SELECT NULL
        FROM employee_attendance ea
        WHERE
        ea.employeeid = em.employeeid
        AND ea.timestamp =  tsi.timestamp
        AND ea.ismanual = 0
    )
    GROUP BY
    em.employeeid,
    tsi.timestamp

10-07 15:54