SQL删除不能得到我需要的结果。子查询,外连接

时间:2016-06-01 19:53:36

标签: sql sql-server sql-server-2008

我有要求见面,我似乎无法弄清楚如何删除所有数据库条目的记录。

我有一张每日更新的表格 结构

    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语句中传递一列。 有什么想法吗?

2 个答案:

答案 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