【问题标题】:SQL delete statement for a rowset行集的 SQL 删除语句
【发布时间】:2019-11-28 14:03:42
【问题描述】:

我需要通过使用 SQL(仅限status =Loaded)比较表 2 来删除行集表 1(4 行集),否则保留该 IG 的行集。

例如,表 1 中的 IG 10 数据将被删除,IG 60 数据将保持与未加载 IG 对应的所有状态相同。

【问题讨论】:

  • 请标记您的 DBMS 产品。
  • SQL 服务器 2008
  • 嗨 Ankit,你能帮忙吗..

标签: sql sql-server tsql sql-delete


【解决方案1】:

您可以尝试以下解决方案。内部SELECT 获取所有未成功加载的IG 值。 DELETE 本身会删除 IG 值不在此列表中的所有行(未成功加载)IG 值。

DELETE FROM Table1 WHERE NOT IG IN (
  SELECT IG FROM Table2 WHERE Status <> 'Loaded'
)

为确保删除正确的行,您可以先使用以下SELECT:

SELECT * FROM Table1 WHERE NOT IG IN (
  SELECT IG FROM Table2 WHERE Status <> 'Loaded'
)

demo on dbfiddle.uk

【讨论】:

  • 谢谢,但我认为这只会删除个别行..我需要删除行集,这意味着每行都有 IG10.. 并保留所有行有 IG60。
  • 这正是这个查询所做的。您可以使用SELECT查看。
  • 太好了,除了 NOT IG IN 似乎很完美,我认为 NOT 不需要提及.. 因为我的目标是删除 IG60 组合。
  • 对不起@Sebastian Brosch 选择发生了一些混乱(我虽然选择删除),你的代码是完美的。非常感谢,你救了我的命 :) 美好的一天
【解决方案2】:

使用NOT IN 子句:

delete from TB1 where not IG in  (
  select IG from TB2 where status <> 'Loaded'
)

【讨论】:

    【解决方案3】:

    试试这个

    delete From [TABLE 1]
    where IG in
    (
    Select IG from [TABLE 2] a where not exists(Select 1 From [TABLE 2] b where a.IG  = b.IG and Status not in ('Loaded') )
    )
    

    【讨论】:

      【解决方案4】:

      你可以试试下面的查询

      DELETE FROM TABLE1 WHERE IG NOT IN (SELECT IG FROM TABLE2 WHERE STATUS = 'ERROR')
      

      【讨论】:

      • 这可能是个问题,因为如果记录的状态不同于 Error 和 Loaded,它们也会被删除。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2019-02-20
      相关资源
      最近更新 更多