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;