SQL 根据 child table 中的特定计数进行更新

SQL Update based on a specific count from a child table

使用微软 Azure SQL 我有以下 select 查询工作。 我需要更新,我为任何 stopsCount = 0 的记录设置 wd.delete_requested = true。 所以换句话说,stop_detail 与 Driver_Wave_Ticket_Table 相关。我需要标记删除任何没有任何 stop_detail 记录的 wave ticket 记录。

    SELECT wd.Id,
(SELECT COUNT(*) FROM Stop_Detail sd WHERE sd.wave_ticket_detail_Id = wd.Id) stopsCount
FROM Driver_Wave_Ticket_Detail wd
WHERE  wd.wave_ticket_date = '1901-01-01 00:00:00.000' 
AND wd.delete_requested IS NULL
AND wd.opened_utc IS  NULL
ORDER BY wd.id, stopsCount

嗯。 . .我在想 not exists:

update wd
    set delete_requested = 1
    from Driver_Wave_Ticket_Detail wd
    where not exists (select 1
                      from Stop_Detail sd 
                      where sd.wave_ticket_detail_Id = wd.Id
                     ) and
          wd.wave_ticket_date = '1901-01-01 00:00:00.000' and
          wd.delete_requested IS NULL and
          wd.opened_utc IS  NULL;

一般来说,not exists 比进行聚合并检查结果是否为 0 更快。

不确定这是否能回答您的问题,但我正在考虑在这种情况下使用 case 语句:

SELECT
a.Id,
a.stopsCount,
CASE WHEN stopsCount = 0 THEN True else FALSE end as delete_flag
FROM
(SELECT wd.Id,
(SELECT COUNT(*) FROM Stop_Detail sd WHERE sd.wave_ticket_detail_Id = wd.Id) stopsCount
FROM Driver_Wave_Ticket_Detail wd
WHERE  wd.wave_ticket_date = '1901-01-01 00:00:00.000' 
AND wd.delete_requested IS NULL
AND wd.opened_utc IS  NULL) a
ORDER BY
a.Id,
a.stopsCount