这应该是一个相对容易回答的问题,但因为我花了一段时间,因为我在本科生中使用DB并且没有我的笔记(我可能应该,是吗?)我需要向互联网寻求帮助。
我有一个问答表的数据库表。每个问题都有一个ID,每个答案都有一个值,每个答案都与某个用户有关。
以下是它的外观的简化示例。
我想要做的是更改所有问题B的答案,用用户回答问题A替换它们。如下:
如果用户还有其他问题和答案,我不想触及那些。我只想替换问题B的值。 所以。嗯......我该怎么做?
答案 0 :(得分:0)
假设答案id是A,B,C等,并且它们都存在于每个user_id,这可以使用分析函数lag()
来解决,有条件地在question_id
上。请注意,通常情况下,answer_value
可能为空,如果A
答案为空,但B
答案实际上有值,则B
答案将被删除(替换为null)。我在测试数据中加入了说明。这也假设每个用户每个问题只有一行(组合question_id, user_id
在表中是唯一的。)
with
db_table ( question_id, user_id, answer_value ) as (
select 'A', 'JIM' , 1 from dual union all
select 'B', 'JIM', 2 from dual union all
select 'C', 'JIM', 4 from dual union all
select 'A', 'PAUL', 3 from dual union all
select 'B', 'PAUL', 1 from dual union all
select 'C', 'PAUL', 3 from dual union all
select 'A', 'MIKE', 2 from dual union all
select 'B', 'MIKE', 1 from dual union all
select 'C', 'MIKE', 4 from dual union all
select 'A', 'ANN' , null from dual union all
select 'B', 'ANN' , 2 from dual union all
select 'C', 'ANN' , 4 from dual
)
-- end of test data; SQL query begins below this line
select question_id, user_id,
case when question_id = 'B'
then lag(answer_value) over (partition by user_id order by question_id)
else answer_value end as answer_value
from db_table
;
<强>输出强>:
QUESTION_ID USER_ID ANSWER_VALUE
----------- ------- ------------
A ANN
B ANN
C ANN 4
A JIM 1
B JIM 1
C JIM 4
A MIKE 2
B MIKE 2
C MIKE 4
A PAUL 3
B PAUL 3
C PAUL 3
12 rows selected.
答案 1 :(得分:0)
我最终使用PL / SQL解决了这个问题。编辑此代码是为了删除我正在处理的任何提示,因为这是为了工作,但这是我所做的一般要点。
proc sql ;
create table to_add as
select * from test2
where a not in (select a from test)
;
insert into test select * from to_add ;
quit;
答案 2 :(得分:-1)
选择t1 SET ANSWER_VALUE =(SELECT QUESTION_ID,USER_ID FORM t2,其中t1.Question_Id = t2.Question_Id&amp;&amp; t1.User_Id = t2.User_Id);