【问题标题】:SQL Update based on a specific count from a child table基于子表中特定计数的 SQL 更新
【发布时间】:2021-04-21 12:11:20
【问题描述】:

使用 Microsoft Azure SQL 我有以下选择查询工作。 我需要一个更新,我为所有 stopCount = 0 的记录设置 wd.delete_requested = true。 所以换句话说,stop_detail 与 Driver_Wave_Ticket_Table 相关。我需要标记删除任何没有任何 stop_detail 记录的波票记录。

    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

【问题讨论】:

  • 请提供样本数据和期望的结果。

标签: sql sql-server azure-sql-database


【解决方案1】:

嗯。 . .我在想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 更快。

【讨论】:

    【解决方案2】:

    不确定这是否能回答您的问题,但我正在考虑针对这种情况使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多