我有一个表定义和示例数据,如下所示。
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'
感谢。
答案 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语句!