2012-06-06 2 views
5

Ich habe eine Update-Anweisung, die unten funktioniert, habe ich eine With-Anweisung in der Unterabfrage verwendet, um die Leistung erheblich zu verbessern, aber aus irgendeinem Grund darf ich keine zusätzliche Spalte aus der gleichen Tabelle zu aktualisieren.Warum kann ich mit With keyword nicht mehr als eine Spalte gleichzeitig aktualisieren?

Works:

UPDATE Table_A SET (Col_One) = (WITH OneValue AS (SELECT DISTINCT t.Col_One 
                FROM Table_Two t, Table_A a 
                WHERE t.id = a.New_Id)) 
           SELECT Col_One FROM OneValue); 

Was würde ich eine andere Spalte nur zu tun ist auch wie diese

UPDATE Table_A SET (Col_One, Col_Two) = (WITH OneValue AS (SELECT DISTINCT t.Col_One, T.Col_two 
                FROM Table_Two t, Table_A a 
                WHERE t.id = a.New_Id)) 
           SELECT Col_One, Col_Two FROM OneValue); 

von Table_Two zu aktualisieren, aber ich bekomme ora-01767-Update eingestellt Ausdruck muss sein eine Unterabfrage Ich verstehe diesen Fehler, sehe aber nicht, wie ich ihn erzeuge. Jede Hilfe wird sehr geschätzt.

Vielen Dank im Voraus.

+1

Ich sehe keinen Grund, warum die Leistung von der Subquery-Factoring-Klausel profitieren würde. Überprüfen Sie die Ausführungspläne, um festzustellen, ob ein Unterschied besteht. –

+0

Nun, ich bin neu in der Codierung, ich bin mir nicht sicher, ob ich Sie richtig beantworten kann, außer zu sagen, dass ich Probleme mit der Leistung von Tabelle 2 hatte, die eine sehr große Tabelle ist. Ich schaute mich um und fand einige sehr hilfreiche Update-Optimierungsinformationen über askTom [link] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:288016031632), angewendet Es ging um meine Situation und Leistung von> 5 Minuten bis <10 Sekunden. – dee

+0

+1 für das Betrachten von Istom, aber -1 für das Nicht-Folgen der Philosophie, die dort gezeigt wird :) Schaue, wie er Leistungsvergleiche macht. Verwenden Sie DBMS_Xplan, um Ausführungspläne für die Abfragen abzurufen und nach Unterschieden zu suchen, und achten Sie auf eine zweite Abfrage, die vom Daten-Caching profitiert. –

Antwort

8

Dies erscheint (mit einer einfachen Abfrage mit DUAL sowieso es tat) zu arbeiten:

UPDATE Table_A SET (Col_One, Col_Two) = (select col_one, col_two from 
              (WITH OneValue AS (SELECT DISTINCT t.Col_One, T.Col_two 
                FROM Table_Two t, Table_A a 
                WHERE t.id = a.New_Id)) 
              SELECT Col_One, Col_Two FROM OneValue) 
             ); 

Was, warum es nicht funktioniert, wenn die Unterabfrage mit „MIT“ beginnt, ich, dass es sich nur vorstellen kann ist, weil die Entwickler von Oracle SQL diese Verwendung nicht vorausgesehen hatten.

+0

Diese Problemumgehung funktioniert. Danke für die schnelle Antwort. Es scheint mir unnötig überflüssig zu sein, aber da ich neu darin bin, kann ich nicht anders, als mich zu fragen, ob es einen logischen Grund dafür gibt. – dee

+0

Danke für die tolle Antwort! Ich war von dem gleichen Problem überrascht und begann ziemlich frustriert zu werden. Immer noch nicht sicher, warum es funktioniert, aber zumindest tut es! :) –

Verwandte Themen