我在MS Access中有两个名为t_task
和t_task_details
的表
t_task
有3列:task_id
,task_description
,task_status
(task_status
列是是/否列,其余为短文本)
t_task_details
还有3列:task_id
,task_date
和done
(done
也是/否)
每个task
都通过task_details
与task_id
相关联。
如果所有 task_status
为是/真
task_details.done
为是/真
我试过这个,但不幸的是它不起作用:
UPDATE t_task
INNER JOIN t_task_details ON t_task.task_id = t_task_details.id
SET t_task.task_status = IIF(Count(t_task_details.done) = 0, True, False)
WHERE t_task_details.done = False
答案 0 :(得分:1)
我认为你可以使用这样的查询:
UPDATE t_task
SET t_task.task_status = true
WHERE (SELECT COUNT(*)
FROM t_task_details
WHERE t_task_details.task_id = t_task.id) =
(SELECT COUNT(*)
FROM t_task_details
WHERE t_task_details.task_id = t_task.id
AND t_task_details.done = True)
我还没有测试过。
请注意,这将更新没有任何详细信息的任务的状态。如果要从更新中删除它们,可以将其添加到查询中:
...
AND EXISTS(SELECT 1 FROM t_task_details
WHERE t_task_details.task_id = t_task.id);
更新:
如果您想将其他记录的状态更新为false,我建议您改为使用此查询:
UPDATE t_task
SET t_task.task_status = IIF(
(SELECT COUNT(*)
FROM t_task_details
WHERE t_task_details.task_id = t_task.id) =
(SELECT COUNT(*)
FROM t_task_details
WHERE t_task_details.task_id = t_task.id
AND t_task_details.done = True), true, false)
WHERE EXISTS(SELECT 1 FROM t_task_details
WHERE t_task_details.task_id = t_task.id);
答案 1 :(得分:1)
您也可以使用DCount和DSum:
UPDATE
t_task
SET
t_task.task_status =
(DCount("*", "t_task_details", "[task_id] = " & t_task.id & "") =
Abs(DSum("[done]","t_task_details", "[task_id] = " & t_task.id & "")))
如果键不是数字:
(DCount("*", "t_task_details", "[task_id] = '" & t_task.id & "'") =
Abs(DSum("[done]","t_task_details", "[task_id] = '" & t_task.id & "'")))