2012-06-06 10 views
5

Mam poniżej polecenie aktualizacji, które działa poprawnie, użyłem instrukcji z podzapytaniem, aby znacznie poprawić wydajność, ale z jakiegoś powodu nie mogę dodać dodatkowej kolumny z tej samej tabeli do aktualizacji.Dlaczego nie mogę zaktualizować więcej niż jednej kolumny w tym samym czasie używając słowa kluczowego "Z"?

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); 

Co chciałbym zrobić, to po prostu zawierać inną kolumnę aby zaktualizować również z table_two jak ten

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); 

ale mam-01767 ora zmiana musi być ustawiony wyrażenie podkwerenda. Rozumiem ten błąd, ale nie widzę, jak go generuję. Każda pomoc jest bardzo doceniana.

Z góry dziękuję.

+1

Nie widzę żadnego powodu, dla którego wydajność mogłaby skorzystać z klauzuli faktorowania podkwerendy. Sprawdź plany wykonania, aby zobaczyć, czy istnieje różnica. –

+0

Będąc nowicjuszem w zakresie kodowania, nie jestem pewien, czy mogę poprawnie odpowiedzieć, z wyjątkiem stwierdzenia, że ​​mam problemy z wydajnością z tabeli 2, która jest bardzo dużą tabelą. Rozejrzałem się i znalazłem bardzo pomocne informacje o optymalizacji aktualizacji poprzez askTom [link] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:288016031632), zastosowane do mojej sytuacji i wydajność spadła z> 5 minut do <10 sekund. – dee

+0

+1 za patrzenie na asktom, ale -1 za nieprzestrzeganie odsłoniętej filozofii :) Zobacz, jak robi porównania wydajności. Użyj DBMS_Xplan, aby uzyskać plany wykonawcze dla zapytań i poszukaj różnic i strzeż się drugiej kwerendy korzystającej z buforowania danych. –

Odpowiedz

8

To wydaje się działać (to zrobił z prostego zapytania Korzystanie z podwójnych tak):

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) 
             ); 

Jak, dlaczego to nie działa, gdy podzapytanie zaczyna się od „Z”, mogę sobie tylko wyobrazić, że to ponieważ projektanci Oracle SQL nie przewidzieli tego użycia.

+0

To obejście działa. Dziękuję za odpowiedź tak szybko. Uderza mnie to jako niepotrzebnie zbędne, ale będąc na tym nowym, nie mogę przestać się zastanawiać, czy ma jakieś logiczne uzasadnienie. – dee

+0

Dzięki za wspaniałą odpowiedź! Byłem zaskoczony tym samym problemem i zaczynałem być bardzo sfrustrowany. Nadal nie wiesz, dlaczego to działa, ale przynajmniej tak jest! :) –

Powiązane problemy