2017-01-06 3 views
-1

이 질문은 비교적 쉽게 대답해야하지만, 학부에서 DB를 사용하고 메모를 작성하지 않아 조금만 지난 것입니다. 나는 아마 그래야한다?) 나는 인터넷에 도움을 청할 필요가있다.SQL : 조건이 충족되면 열의 값을 같은 열의 다른 열로 복사하십시오.

나는 질문과 답변의 DB 테이블을 가지고 있습니다. 각 질문에는 ID가 있으며 각 대답에는 가치가 있으며 각각의 질문은 특정 사용자와 관련이 있습니다.

다음은 어떻게 보이는지에 대한 간단한 예입니다.

Output

다른 질문이있는 경우와 :

Input

는 내가 뭘 원하는과 같이 A. 질문에 대답 모든 질문 B의 그 사용자와 교체에 대한 답변을 변경할 수있다 사용자에 대한 답변, 나는 그들을 만지 싶지 않아. 난 그냥 질문 B에 대한 값을 대체하고 싶습니다. 그럼. 음 ... 어떻게해야합니까?

+0

그래서 user_id에 대한 모든 question_id가 해당 사용자의 question_id A 응답으로 대체 되었습니까? –

+0

이미지를 참조하십시오. 질문 B의 ANSWER_VALUE를 질문 A의 ANSWER_VALUE로 설정하고 각 사용자마다 개별적으로 설정하겠습니다. 두 번째 이미지의 강조 표시된 빨간색 값은 변경하려는 값입니다. – Inglonias

+0

나는 또한 당신의 코멘트를 다시 읽고 그것을 잘못 해석했다는 것을 깨달았다. 나는 네가 옳다고 생각한다. (이 때문에 컴퓨터 대신 사람에게 묻는 이유와 그림을 사용하는 이유가 있습니다. 내가 원하는 것을 정확하게 말로 표현하는 것이 어렵습니다.) – Inglonias

답변

0

나는이 사용하는 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; 
/
-1

선택 T1 세트 ANSWER_VALUE = (QUESTION_ID, USER_ID 평가서 T2를 선택 여기서 t1.Question_Id t2.Question_Id = & & t1.User_Id = t2.User_Id);

+0

그게 농담입니까? 아니면 오라클이 아닌 다른 제품의 구문입니까? – mathguy

0

대답 ID가 A, B, C 등으로 가정하고 모든 user_id에 모두 해당한다고 가정 할 경우 조건부로 에있는 분석 함수 lag()을 사용하여 해결할 수 있습니다. 일반적으로 answer_value은 null 일 수 있으며 A 답변이 null이지만 실제로 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. 
관련 문제