Sql Oracle在一条语句中删除和插入

Sql Oracle在一条语句中删除和插入,sql,oracle,Sql,Oracle,我有如下表定义和示例数据 user_id,attr_key,attr_val,rating,status user_1,k1,v1,5,ACT user_1,k2,v2,6,ACT user_2,k1,v1,3,INACT user_2,k2,v2,2,ACT user_2,k3,v3,8,ACT root,k1,v1,9,ACT root,k2,v2,8,ACT 是否可以编写一条查询语句,用user_2覆盖根用户的数据,如果user_2数据的状态不正确,则应使用ACT将其复制到根用户?请参阅

我有如下表定义和示例数据

user_id,attr_key,attr_val,rating,status
user_1,k1,v1,5,ACT
user_1,k2,v2,6,ACT
user_2,k1,v1,3,INACT
user_2,k2,v2,2,ACT
user_2,k3,v3,8,ACT
root,k1,v1,9,ACT
root,k2,v2,8,ACT
是否可以编写一条查询语句,用user_2覆盖根用户的数据,如果user_2数据的状态不正确,则应使用ACT将其复制到根用户?请参阅下面的预期输出

Expected output of query:
user_id,attr_key,attr_val,rating,status
user_1,k1,v1,5,ACT
user_1,k2,v2,6,ACT
user_2,k1,v1,3,INACT
user_2,k2,v2,2,ACT
user_2,k3,v3,8,ACT
root,k1,v1,3,ACT
root,k2,v2,2,ACT
root,k3,v3,8,ACT
Hogan的查询:(TODO:在同一语句中插入之前删除根)


谢谢。

您想使用过滤器插入基于某些数据的内容。使用insert、select和where子句:

INSERT INTO Your_table_name_which_you_did_not_tell_us
  SELECT 'root', attr_key, attr_val, rating, 'ACT'
  FROM Your_table_name_which_you_did_not_tell_us
  WHERE status = 'INACT'
不能在一个查询中删除和插入。您可以使用如下事务将其作为原子操作执行:

WHENEVER SQLERROR ROLLBACK;

BEGIN TRANSACTION;

DELETE FROM some_table WHERE user_id='root';

INSERT INTO some_table
  SELECT 'root', attr_key, attr_val, rating, 'ACT'
  FROM some_table
  WHERE user_id = 'user_1';

COMMIT TRANSACTION;

这样,只有在插入没有失败的情况下,才能执行删除操作。您还将在事务运行时锁定表,防止修改。(有一些命令可以解决这个问题,但我们希望人们在使用它们时知道自己在做什么。)

使用oracle合并语句

这是可能的。但这不是一个脚本编写服务;你需要做你自己的学习和尝试。如果你被语法中的一个具体细节难住了,就把这个问题贴出来;但是不要要求别人为你写代码。这只是一个插入。。。尚未删除任何数据Hanks Hogan。这看起来很接近我要找的。在我原来的问题中稍微改变一下你的提问。唯一剩下的就是在插入之前删除数据。我怎么能在同一句话中做到这一点?@user322372我不明白你想要删除什么数据,所以我不能帮你。好的@user322372-我发布了一个答案——可能是你想要的。这被错误地否决了,你确实可以用merge来做,尽管它看起来确实有问题。
WHENEVER SQLERROR ROLLBACK;

BEGIN TRANSACTION;

DELETE FROM some_table WHERE user_id='root';

INSERT INTO some_table
  SELECT 'root', attr_key, attr_val, rating, 'ACT'
  FROM some_table
  WHERE user_id = 'user_1';

COMMIT TRANSACTION;