我有要求见面,我似乎无法弄清楚如何删除所有数据库条目的记录。
我有一张每日更新的表格 结构
ID Name eventnum state
1 a 1 4
2 a 1 2
3 a 1 3
4 a 1 9
5 b 3 1
由于完全不受我控制的事情,用户可以输入相同的信息,但是当一个“状态”列的条目为9时,删除具有相同名称和eventnum的所有数据行的夜间作业(所以id 1-4将被删除)。
在Oracle中,我可以使用子查询执行此操作,但在Microsoft SQL中,我看起来只能在IN语句中传递一列。 有什么想法吗?
答案 0 :(得分:4)
TSQL不支持in
中的元组,但很容易用EXISTS
替换所有所需列上的等式谓词。
DELETE T1
FROM YourTable T1
WHERE EXISTS
(
SELECT *
FROM YourTable T2
WHERE T2.State=9
AND T1.Name = T2.Name
AND T1.EventNum = T2.EventNum
)
答案 1 :(得分:2)
您可以为此使用相关子查询,也可以对子查询使用JOIN
。您也可以使用简单的自联接(列出的最后一个查询)。
DELETE MT
FROM
MyTable MT
INNER JOIN (SELECT name, eventnum FROM MyTable WHERE [state] = 9) SQ ON
SQ.name = MT.name AND
SQ.eventnum = MT.eventnum
或者:
DELETE MT1
FROM
MyTable MT1
WHERE
EXISTS
(
SELECT *
FROM MyTable MT2
WHERE
MT2.name = MT1.name AND
MT2.eventnum = MT1.eventnum AND
MT2.[state] = 9
)
或者:
DELETE MT2
FROM
MyTable MT1
INNER JOIN MyTable MT2 ON
MT2.name = MT1.name AND
MT2.eventnum = MT1.eventnum
WHERE
MT1.[state] = 9