【问题标题】:while deleting data in particular range deleting all data from sql server在删除特定范围内的数据时从 sql server 中删除所有数据
【发布时间】:2014-05-15 21:13:35
【问题描述】:

我有一张表 Transaction_tbl 包含这些列:

transactid   Tbarcode     dtime

1            100          2013-04-16 14:15:47.243
2            101          2013-05-10 10:15:47.243
3            102          2014-02-20 02:15:48.000

在此表中,transactid 是主键。

我还有一张表 KHanger_tbl 包含这些列:

transactid   Hbarcode
1             21
2             22
3             23

在我的KHanger_tbl 这个transactid is the foregin key

我想将日期范围 Transaction 表移动到另一个名为 Transaction2013.. 的表(我的意思是 2013 年的数据)

所以我写了这样的查询:

第一次查询

SELECT * 
INTO   transaction2013 
FROM   transaction_tbl 
WHERE  dtime <= '2013-12-30' 

第二次查询

    SELECT k.transactid, 
       k.tid, 
       k.requested, 
       k.hbarcode, 
       k.reqloc, 
       k.delivered 
INTO   khanger2013 
FROM   khanger_tbl k 
       INNER JOIN transaction_tbl t 
               ON t.transactid = k.transactid 
WHERE  t.dtime <= '2013-12-30' 

然后我想从 Khanger_tbl 和 Transaction_tbl 中删除相应的 2013 年数据,所以首先我写了这样的查询:

    DELETE FROM khanger_tbl 
WHERE  EXISTS (SELECT 1 
               FROM   khanger_tbl 
                      INNER JOIN transaction_tbl 
                              ON transaction_tbl.transactid = 
                                 khanger_tbl.transactid 
                                 AND transaction_tbl.dtime <= '2013-12-30'); 

但这已删除我的整个 KHanger_tbl ..我的查询有什么问题?

【问题讨论】:

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


    【解决方案1】:

    您的 DELETE 查询会删除所有行,因为您与内部子查询没有关系,因此 KHandler_tbl 子查询中的每一行都存在。尝试使用以下内容:

    DELETE T1
    FROM KHanger_tbl T1
    INNER JOIN Transaction_tbl T2
      ON T1.transactid = T2.transactid
    Where T2.dtime <='2013-12-30'
    

    或者只是

      DELETE FROM KHanger_tbl 
            WHERE transactid IN (SELECT transactid 
                                  FROM Transaction_tbl 
                                  WHERE dtime <='2013-12-30')
    

    【讨论】:

      【解决方案2】:

      您不需要使用 Oracle 语法来删除 SQL Server 中的记录。 SQL Server 允许您这样做:

      DELETE FROM khanger_tbl a
      INNER JOIN transaction_tbl b on a.transactid = b.transactid
      WHERE b.dtime <= '2013-12-30'; 
      

      希望对您有所帮助。

      【讨论】:

      • 没问题。祝你好运。
      猜你喜欢
      • 2022-10-14
      • 2011-04-10
      • 2021-11-10
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多