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,因为您不返回记录,只是一个布尔值,但如果它不起作用,您可以将其替换为 *.
我有 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,因为您不返回记录,只是一个布尔值,但如果它不起作用,您可以将其替换为 *.