SQL:如果满足条件,则将值从列复制到同一列中的另一行

时间:2017-01-06 17:32:36

标签: sql oracle

这应该是一个相对容易回答的问题,但因为我花了一段时间,因为我在本科生中使用DB并且没有我的笔记(我可能应该,是吗?)我需要向互联网寻求帮助。

我有一个问答表的数据库表。每个问题都有一个ID,每个答案都有一个值,每个答案都与某个用户有关。

以下是它的外观的简化示例。

Input

我想要做的是更改所有问题B的答案,用用户回答问题A替换它们。如下:

Output

如果用户还有其他问题和答案,我不想触及那些。我只想替换问题B的值。 所以。嗯......我该怎么做?

3 个答案:

答案 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);