SQL 不在子查询中时更新?

SQL Update when not in subquery?

我有 2 个表:

tblAbsence

Name  Start    End    Status
John 4/2/18   4/5/18  Approved 
Sue  5/1/18   5/10/18 Denied

tblManning

Date    Required
4/1/18     3
4/2/18     4
4/3/18     2

我希望能够将 tblAbsence.Status 更新为 "Approved",只要缺席请求期间的必需值不超过任意限制(例如 4)。

在查看@Jeffrey 的提议并进行试验后,我想我需要一个更新查询,当在下面的查询中找不到请假请求时,它设置 [Status]= Approved。下面的查询将告诉我请求是否有超过限制的天数。

SELECT tblAbsence.name, tblAbsence.start, tblAbsence.end
FROM tblAbsence, tblManning
WHERE tblManning.Date >= Int([tblAbsence].[Start]) And tblManning.Date <= [tblAbsence].[End] AND tblManning.[Req]>3
GROUP BY tblAbsence.name, tblAbsence.[Start], tblAbsence.end;

我将上面的查询重命名为 qryLv 并尝试了这个 Left Join 但它告诉我必须使用可更新的查询????

Update tblAbsence a
Left Join qryLv L
ON L.name = a.name AND l.start = a.start
SET a.Status = "Approved"
WHERE l.name is null;

显示您的错误是因为在 WHERE 子句中使用子查询时,您必须将 IN/EXISTS 与变量等同或使用。但是,我不确定您是否需要子查询,我认为这样的方法可行:

UPDATE tblAbsence SET tblAbsence.Status = "Approved"
FROM tblAbsence, tblManning
WHERE tblManning.Date > tblAbsence.Start
    AND tblManning.Date <= tblAbsence.End + #23:59:59#
    AND tblManning.Required < 4;

好的,有点错过了那部分,您将需要一个子查询。我认为您需要使用 NOT EXISTS 来检查您的子查询 returns 是否有任何值,这应该适合您。

UPDATE tblAbsence SET tblAbsence.Status = "Approved"
FROM tblAbsence
WHERE NOT EXISTS (
    SELECT NULL
    FROM tblManning 
    WHERE tblManning.Date > tblAbsence.Start
        AND tblManning.Date <= tblAbsence.End + #23:59:59#
        AND tblManning.Required < 4);

我认为您可以在子查询中使用 NULL,因为您不返回记录,只是一个布尔值,但如果它不起作用,您可以将其替换为 *.