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
使用微软 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