2012-06-06 30 views
5

Tôi có tuyên bố cập nhật được hiển thị bên dưới hoạt động tốt, tôi đã sử dụng câu lệnh có trong truy vấn con để cải thiện hiệu suất nhưng vì lý do nào đó, tôi không được phép thêm cột bổ sung từ cùng một bảng để cập nhật.Tại sao tôi không thể cập nhật nhiều cột cùng một lúc bằng Từ khoá?

trình:

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

Những gì tôi muốn làm là chỉ cần bao gồm một cột để cập nhật cũng từ table_two như thế này

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

nhưng tôi nhận ora-01.767 bản cập nhật thiết lập biểu phải một truy vấn phụ. Tôi hiểu lỗi này nhưng không thấy cách tôi tạo ra nó. Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

Xin cảm ơn trước.

+1

Tôi không thấy bất kỳ lý do gì khiến hiệu suất sẽ được hưởng lợi từ mệnh đề bao thanh toán phụ. Kiểm tra các kế hoạch thực hiện để xem có sự khác biệt nào không. –

+0

Cũng mới để viết mã, tôi không chắc chắn tôi có thể trả lời bạn một cách chính xác trừ khi nói rằng tôi đã gặp rắc rối với hiệu suất từ ​​bảng 2 mà là một bảng rất lớn. Tôi nhìn xung quanh và tìm thấy một số thông tin cập nhật rất hữu ích thông qua askTom [link] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:288016031632), áp dụng nó đến tình hình và hiệu suất của tôi đã đi từ> 5 phút đến <10 giây. – dee

+0

+1 để xem asktom, nhưng -1 cho không theo triết lý tiếp xúc ở đó :) Có một cái nhìn về cách anh ta so sánh hiệu suất. Sử dụng DBMS_Xplan để có được kế hoạch thực hiện cho các truy vấn và tìm sự khác biệt, và hãy cẩn thận của một truy vấn thứ hai được hưởng lợi từ bộ nhớ đệm dữ liệu –

Trả lời

8

Điều này dường như làm việc (nó đã làm với một truy vấn đơn giản sử dụng DUAL anyway):

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

Đối với lý do tại sao nó không hoạt động nếu subquery bắt đầu với "VỚI", tôi chỉ có thể tưởng tượng rằng nó là bởi vì các nhà thiết kế của Oracle SQL đã không lường trước được cách sử dụng này.

+0

Workaround workaround này. Cảm ơn bạn đã trả lời quá nhanh. Nó không tấn công tôi như là không cần thiết dư thừa mặc dù nhưng là mới đến điều này tôi không thể không tự hỏi nếu nó có một số lý do hợp lý cho nó. – dee

+0

Cảm ơn câu trả lời tuyệt vời! Tôi đã bối rối bởi vấn đề này và bắt đầu nhận được khá thất vọng. Vẫn không chắc chắn lý do tại sao nó hoạt động, nhưng ít nhất nó có! :) –

Các vấn đề liên quan