我有一个SQL语句,从3个不同的表插入到表数据,并与条件连接它们,我想用DELETE语句恢复插入(给定日期作为删除语句中的输入值)。
INSERT INTO ORD FROM DATASOURCE_ORD INNER JOIN (
SELECT DISTINCT Field_1, Field_2 FROM INVOICE INNER JOIN (
SELECT DISTINCT Field_3 FROM FI WHERE DATE >= Input_Value) ON
(FI.Field_3 = INVOICE.FIELD_2))A
ON (A.Field_4 = DATASOURCE_ORD.Field_5 AND INVOICE.Field_1 =
DATASOURCE_ORD.Field_6)
当我尝试使用WHERE EXISTS
并保留第二个INNER JOIN
的A
时,它会抛出incorrect syntax near A
知道如何转换插入语句吗?删除语句
Thank you so much
SQL提供了一种机制来"恢复插入…">-它被称为ROLLBACK
。当然,这只在插入数据的事务还没有被COMMIT
ted的情况下才有效。
如果您想精确地删除由INSERT
语句插入的元组,那么您需要知道这些元组的主键。当你有了这些钥匙,那就是DELETE FROM ORD WHERE <primary key> in (<pk1>, <pk2>,...)
的问题了。
但这似乎不是OP所要求的——至少不是完全正确的。
这里需要注意的重要一点是,可以将用于INSERT
的等效过滤条件应用于DELETE
操作。然而,即使过滤器是等效的,它仍然可能影响其他元组,而不是之前插入的元组。
这是因为所涉及的表可以(而且很可能)包含来自其他事务的数据。这些其他记录可以很容易地从INSERT
语句中包含到筛选条件中。
另外,"target"表似乎不包含已在筛选条件中使用的数据。实际上,这在过滤器条件和目标表中的条目之间创建了一个不可逆的映射。
当然,仍然可以继续(并把数据弄得一团糟),并从目标表中删除匹配(现在)筛选条件":
的记录。DELETE FROM ORD
WHERE
EXISTS
(SELECT * FROM DATASOURCE_ORD DS_ORD
INNER JOIN (
SELECT DISTINCT Field_1, Field_2 FROM INVOICE
INNER JOIN (
SELECT DISTINCT Field_3 FROM FI WHERE DATE >= Input_Value)
ON
(FI.Field_3 = INVOICE.FIELD_2))A
ON (A.Field_4 = DATASOURCE_ORD.Field_5 AND INVOICE.Field_1 =
DATASOURCE_ORD.Field_6)
WHERE
(ORD.<col1> = DS_ORD.<col1>,
ORD.<col2> = DS_ORD.<col2>,
..)
)
注意:虽然这在技术上应该可以工作,但它会把数据弄乱因为它没有这样做,OP可能想要实现的是:撤销目标表上的INSERT
操作。
删除意味着数据已经存在于ORD表中,因此不需要在DELETE脚本中编写内部连接。只需直接从ORD表中删除字段名,这样您就不必在Where子句中写a或b。