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