删除特定范围内的数据时删除sql server中的所有数据

时间:2014-05-15 13:06:10

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

我有一个表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

我想将日期范围< = 2013-12-30数据从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 ..我的查询出了什么问题?

2 个答案:

答案 0 :(得分:2)

您的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')

答案 1 :(得分:0)

您无需使用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'; 

希望有所帮助。