Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:若满足条件,则将值从列复制到同一列中的另一行_Sql_Oracle - Fatal编程技术网

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

SQL:若满足条件,则将值从列复制到同一列中的另一行,sql,oracle,Sql,Oracle,这应该是一个相对容易回答的问题,但因为我在本科学习DB已经有一段时间了,没有我的笔记,所以我可能应该,是吗?我需要上网寻求帮助 我有一个DB问答表。每个问题都有一个ID,每个答案都有一个值,并且每个问题都与某个用户相关 下面是一个简单的示例,展示了它的外观 我想做的是更改所有问题B的答案,将其替换为用户对问题A的答案。如下所示: 如果用户还有其他问题和答案,我不想碰这些。我只想替换问题B的值。 所以嗯。。。我该怎么做?选择t1设置答案值=选择问题ID,用户ID表格t2,其中t1.问题ID=t2.

这应该是一个相对容易回答的问题,但因为我在本科学习DB已经有一段时间了,没有我的笔记,所以我可能应该,是吗?我需要上网寻求帮助

我有一个DB问答表。每个问题都有一个ID,每个答案都有一个值,并且每个问题都与某个用户相关

下面是一个简单的示例,展示了它的外观

我想做的是更改所有问题B的答案,将其替换为用户对问题A的答案。如下所示:

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

选择t1设置答案值=选择问题ID,用户ID表格t2,其中t1.问题ID=t2.问题ID&&t1.用户ID=t2.用户ID

假设答案id为A、B、C等,并且每个用户的答案id都存在,这可以通过分析函数lag来解决,有条件地取决于问题id。请注意,一般情况下,答案id值可能为空,如果A答案为空,但B答案实际有一个值,则B答案将被删除并替换为空。我在测试数据中添加了说明。这还假设每个用户对于每个问题只有一行。组合问题id,用户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
;
输出:


我最终用PL/SQL解决了这个问题。这段代码被编辑以删除我正在做的任何提示,就像这是为了工作一样,但这是我所做的一般要点

DECLARE
q_id_from_update varchar2(45);
q_id_to_update varchar2(45);
BEGIN
    SELECT QUESTION_ID
    INTO q_id_to_update
    FROM QUESTION
    WHERE QUESTION.NAME = 'QUESTION_A';

    SELECT QUESTION_ID
    INTO q_id_from_update
    FROM QUESTION
    WHERE QUESTION.NAME = 'QUESTION_B';

FOR a IN (SELECT
        ANSWER.QUESTION_ID,
        ANSWER.USER_ID,
        ANSWER.ANSWER
    FROM ANSWER
    WHERE ANSWER.QUESTION_ID = q_id_from_update AND
        ANSWER.ANSWER IS NOT NULL)
    LOOP
        UPDATE ANSWER
        SET ANSWER.ANSWER = a.ANSWER
        WHERE ANSWER.USER_ID = a.USER_ID AND
            ANSWER.QUESTION_ID = q_id_to_update;
    END LOOP;
    COMMIT;
END;
/

那么,您是否希望将用户的所有问题\u id替换为该用户的问题\u id a的答案?请参见图片。我希望将问题B的ANSWER_值设置为问题A的ANSWER_值,但对每个用户单独设置。第二张图上以红色突出显示的值是我想要改变的。我也只是重新阅读了你的评论,意识到我误解了它。我想你是对的。这也是为什么我问人类而不是电脑,为什么我用图片。我很难用语言表达我到底想要什么那是个笑话吗?或者这是另一个产品的语法,而不是Oracle?
DECLARE
q_id_from_update varchar2(45);
q_id_to_update varchar2(45);
BEGIN
    SELECT QUESTION_ID
    INTO q_id_to_update
    FROM QUESTION
    WHERE QUESTION.NAME = 'QUESTION_A';

    SELECT QUESTION_ID
    INTO q_id_from_update
    FROM QUESTION
    WHERE QUESTION.NAME = 'QUESTION_B';

FOR a IN (SELECT
        ANSWER.QUESTION_ID,
        ANSWER.USER_ID,
        ANSWER.ANSWER
    FROM ANSWER
    WHERE ANSWER.QUESTION_ID = q_id_from_update AND
        ANSWER.ANSWER IS NOT NULL)
    LOOP
        UPDATE ANSWER
        SET ANSWER.ANSWER = a.ANSWER
        WHERE ANSWER.USER_ID = a.USER_ID AND
            ANSWER.QUESTION_ID = q_id_to_update;
    END LOOP;
    COMMIT;
END;
/