2017-01-06 4 views
-1

Dies sollte eine relativ einfache Frage zu beantworten sein, aber weil es eine Weile her ist, dass ich DB in und ohne meine Notizen (Ich sollte wahrscheinlich, ja?) Ich muss das Internet um Hilfe bitten.SQL: Kopiere den Wert aus der Spalte in eine andere Zeile in der gleichen Spalte

Ich habe eine DB-Tabelle mit Fragen und Antworten. Jede Frage hat eine ID, jede Antwort hat einen Wert und jeder dieser Fragen bezieht sich auf einen bestimmten Benutzer.

Hier ist ein vereinfachtes Beispiel, wie es aussieht.

Input

Was ich will ist tun, um die Antworten auf alle sie mit, dass die Nutzer der Frage B ändern ersetzt beantworten A. in Frage zu stellen, wie so:

Output

Wenn es andere Fragen und Antworten für den Benutzer, ich möchte diese nicht anfassen. Ich möchte nur den Wert für die Frage B ersetzen. So. Ähm ... wie mache ich das?

+0

also möchten Sie alle Frage_ID für eine user_id mit Antwort von question_id A für diesen Benutzer ersetzt? –

+0

Siehe die Bilder. Ich möchte, dass ANSWER_VALUE für Frage B auf ANSWER_VALUE der Frage A gesetzt wird, aber für jeden Benutzer einzeln. Die hervorgehobenen Werte in Rot auf dem zweiten Bild sind was ich ändern möchte. – Inglonias

+0

Ich lese auch gerade Ihren Kommentar und merke, dass ich es falsch interpretiert habe. Ich denke, du hast Recht. (Dies ist auch der Grund, warum ich Menschen anstelle eines Computers frage und warum ich Bilder verwende. Es ist schwer für mich, genau in Worte zu fassen, was ich will) – Inglonias

Antwort

0

I endete dies mit PL/SQL-up zu lösen. Dieser Code wird bearbeitet, um alle Hinweise darauf, woran ich gerade arbeite, zu entfernen, da dies für die Arbeit war, aber das ist der allgemeine Kern dessen, was ich getan habe.

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

select t1 SET ANSWER_VALUE = (SELECT QUESTION_ID, USER_ID FORM t2 wo t1.Question_Id = t2.Question_Id & & t1.User_Id = t2.User_Id);

+0

Ist das ein Witz? Oder ist das vielleicht Syntax von einem anderen Produkt, nicht von Oracle? – mathguy

0

Wenn angenommen wird, dass die Antwort-IDs A, B, C usw. sind und dass sie alle für jede user_id vorhanden sind, kann dies unter Verwendung der analytischen Funktion lag() unter der Bedingung question_id gelöst werden. Beachten Sie, dass answer_value im Allgemeinen Null sein kann, und wenn die A Antwort null war, aber die B Antwort tatsächlich einen Wert hatte, wird die B Antwort gelöscht (durch Null ersetzt). Ich habe die Testdaten zur Veranschaulichung hinzugefügt. Dies setzt auch voraus, dass jeder Benutzer nur eine Zeile für jede Frage hat (die Kombination ist einzigartig in der Tabelle).

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 
; 

Ausgang:

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. 
Verwandte Themen