我有一个表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 ..我的查询出了什么问题?
答案 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';
希望有所帮助。