Oracle删除并插入一个语句

时间:2016-09-12 15:27:43

标签: 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覆盖root用户数据的查询语句,如果user_2数据的状态是INACT,那么它应该用ACT复制到root用户?请参阅下面的预期输出。

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之前删除root)

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

感谢。

2 个答案:

答案 0 :(得分:0)

您希望使用过滤器根据某些数据插入内容。使用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;

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

答案 1 :(得分:0)

使用oracle MERGE语句!