使用IF内部的Count更新布尔字段作为条件

时间:2015-09-16 04:23:05

标签: sql database ms-access

我在MS Access中有两个名为t_taskt_task_details的表

t_task有3列:task_idtask_descriptiontask_statustask_status列是是/否列,其余为短文本)

t_task_details还有3列:task_idtask_datedonedone也是/否)

每个task都通过task_detailstask_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

2 个答案:

答案 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 & "'")))