2016-04-29 18 views
0

Ich habe ein wenig Erfahrung in SQL und stieß auf den folgenden Code für SQLPlus/Oracle. Ich bin ein wenig verwirrt, warum Sie ein Update mit diesem Code machen. Die Tabelle Beispiel ist tabelle1 mit Spalten col1, col2, col3SQL-Update mit Unterabfrage in Where-Klausel

update e 
    set grade='HD' 
    where stu_no=(
      select stu_no 
      from e 
      where result >80 and grade !='HD') 
     and unit_code=(
      select unit_code 
      from e 
      where result >80 and and grade !='HD') ; 

Warum kann es nicht einfach ein Update wie die folgenden sein,

update e 
    set grade = 'HD' 
where result >= 80 
    and grade != 'HD' 

Vielen Dank im Voraus für jede Hilfe!

EDIT: Added den eigentlichen Code, ohne die Tabellennamen zu ändern

+0

Hinweis : Die Unterabfragen ** sollten ** skalare Unterabfragen sein, oder die '= (Unterabfrage)' sollte eigentlich 'IN (Unterabfrage)' sein – joop

+0

Dies ist definitiv anders als das, was Sie ursprünglich gepostet haben - jetzt gibt es vier Spalten im Spiel, in Ihrem Umschreiben gab es nur noch drei. – mathguy

+0

Entschuldigung. Wird dadurch deutlicher, warum diese Methode vorgeschlagen wird und nicht nur die Spalten für Ergebnis und Bewertung? –

Antwort

0

Da die Bedingung Subqueries (select stu_no from e where result > 80 and grade !='HD') muss Rückkehr nur ein Ergebnis, oder andernfalls die Abfrage einen Fehler zurück, dann kann es wirklich getan werden ohne Unterabfragen.

Vielleicht ist das beabsichtigt: nur aktualisieren, wenn es einen einzelnen Datensatz gibt, der den Bedingungen entspricht. Aber das ist ziemlich viel Aufwand für solch eine einfache Überprüfung.

Bitte beachten Sie den Kontext, in dem dies gemacht wurde. Einige Dinge in der Informatik können ziemlich schwierig sein.

+0

Ich habe die obigen Abfragen mit den tatsächlichen Tabellennamen des Kontexts geändert. Vielleicht hilft das. Warum sollte der obige Code nur einen einzelnen Datensatz aktualisieren? Werden die Unterabfragen nicht mehrere Zeilen zurückgeben, wenn die Bedingungen der WHERE-Klausel erfüllt sind? –

0

Wenn ich Ihre Frage richtig verstanden habe, wollen Sie IFF einen weiteren Rekord exists, mit dem gleichen {col1, col2} und mit (col2> 0 und col3 <> 'XYZ') zu aktualisieren:

UPDATE table1 t1 
    SET col3 = 'XYZ' 
WHERE EXISTS (
    SELECT * 
    from table1 ex 
    WHERE ex.col1 = t1.col1 AND ex.col2 = t1.col2 
    AND col2 > 0 and col3 <> 'XYZ' 
    ) 
    ;