SAP HANA:将SQL Insert语句转换为delete语句



我有一个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 JOINA时,它会抛出incorrect syntax near A

知道如何转换插入语句吗?删除语句

Thank you so much

SQL提供了一种机制来"恢复插入…">-它被称为ROLLBACK。当然,这只在插入数据的事务还没有被COMMITted的情况下才有效。

如果您想精确地删除由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。

相关内容

  • 没有找到相关文章

最新更新