我计划删除通过 CTE 从表 B 找到的键内的表 A 的数据。但不知何故,这个 CTE 没有从表 A 中删除任何内容,而是删除了表 B 中的我的数据。
WITH tableA AS
(
SELECT TOP (100)
txn_id, customer_id
FROM
tableB
WHERE
create_date < DATEADD(DAY, DATEDIFF(DAY, 1500, GETDATE()), 0)
ORDER BY
create_date ASC
)
DELETE FROM tableA;
我执行这条SQL语句后,SMSS说有100行受到影响。
然后我立即执行了一个
COUNT(*)
语句来看看事情进展如何。结果发现A表没有删除任何内容,B表却删除了100行数据。
所以我认为我写错了 CTE,需要帮助来纠正这个 SQL。
为什么要使用 CTE?为什么不只是一个子查询呢?假设
txn_id
是公共密钥。
DELETE FROM tableA
WHERE txn_id IN (
SELECT TOP (100) txn_id
FROM tableB
WHERE create_date < DATEADD(DAY, DATEDIFF(DAY, 1500, GETDATE()), 0)
ORDER BY create_date ASC
)