2015-02-05 17 views
10

Tôi đang cố gắng viết INSERT INTO thực hiện công việc DISTINCT/GROUP BY. Truy vấn chạy hoàn toàn tốt như một câu lệnh chọn, nhưng sẽ không hoạt động nếu nó được bao bọc trong một INSERT INTO.Truy vấn GROUP BY hợp lệ không hoạt động khi được kết hợp với INSERT INTO trên Oracle

INSERT INTO MasterRecords 
    (BatchRecordRecordID, SourceID, BatchID) 
SELECT RecordID, SourceID, BatchID 
FROM (
    SELECT RecordID, BatchID, 101 AS SourceID 
    FROM BatchRecords 
    WHERE BatchID = 150 
    GROUP BY RecordID, BatchID 
) BR 

này kiếm được tôi:

SQL Error: ORA-00979: not a GROUP BY expression

Nhưng nếu tôi loại bỏ chỉ INSERT INTO mã, nó chạy hoàn toàn tốt đẹp:

SELECT RecordID, SourceID, BatchID 
FROM (
    SELECT RecordID, BatchID, 101 AS SourceID 
    FROM BatchRecords 
    WHERE BatchID = 150 
    GROUP BY RecordID, BatchID 
) BR 

Kết quả:

3 101 150 
5 101 150 
6 101 150 
2 101 150 
4 101 150 
8 101 150 
7 101 150 
1 101 150 

My giả định là GROUP BY's không được phép bên trong INSERT INTO câu lệnh chọn nhưng tôi có thể tìm thấy gần như không có tài liệu nào xác nhận điều này.

+1

Điều gì sẽ xảy ra nếu bạn chạy phần bên trong tự chọn nhất? (bảng dẫn xuất là không thực sự cần thiết anyway) Tôi nhớ lại một lỗi mà không hợp lệ 'nhóm by' điều khoản đã không được công nhận trong một bảng có nguồn gốc hoặc phụ chọn. Đừng nhớ chi tiết. Ngoài ra, (không liên quan): '150 AS BatchID' không thực sự có ý nghĩa nếu bạn sử dụng' WHERE BatchID = 150' –

+0

Hoạt động tương tự nếu nó không được gói lại với lựa chọn bên ngoài. Và BatchID được mã hóa cứng chỉ là từ vùng đầu của tôi, logic đó không quan trọng. –

+0

Nếu bạn thêm RecordID vào nhóm bằng cách nó hoạt động? – xQbert

Trả lời

0

Tự hỏi nếu đó là một thứ tự của vấn đề thực hiện ... nó có hoạt động nếu bạn sử dụng CTE không? CTE trước tiên phải hiện thực như vậy, giải quyết nhóm bằng ...

Insert INTO MasterRecords (BatchRecordRecordID, SourceID, BatchID) 
    WITH BR AS (
    SELECT RecordID, 101 AS SourceID, 150 AS BatchID 
    FROM BatchRecords 
    GROUP BY RecordID, 101,150) 
    Select RecordID, SourceID, BatchID FROM BR 

hoặc ... tại sao nhóm bằng và mệnh đề where ở nơi đầu tiên dường như không thể làm bất cứ điều gì kể từ recordID không phải là một tổng hợp và không phải là một phần của nhóm bằng cách ...

Chèn vào masterRecords (batchrecordRecordID, sourceid, Id lô) CHỌN recordID, 101, 150 từ batchRecords

+0

Tôi không quen với Oracle như với SQL Server, Oracle có hỗ trợ CTE không? –

+3

@TomHalladay: nó đã * dài * trước SQL Server –

+0

nhờ: http://stackoverflow.com/questions/24008316/insert-into-from-cte cập nhật phản hồi của tôi. – xQbert

2

tôi nghĩ sai, nhưng không phải là sql dưới đây bằng những gì bạn muốn đạt được?

INSERT INTO MasterRecords(BatchRecordRecordID, SourceID, BatchID) 
SELECT DISTINCT RecordID, 101, 150 
FROM BatchRecords 
WHERE BatchID = 150 
; 
+0

Điều này dường như đang hoạt động ngay cả khi tôi chắc chắn nó không hoạt động sớm hơn –

0

Sự cố được giải quyết bằng cách tự động thay đổi giá trị của thông số (optimizer_features_enable). Giá trị này xác định phiên bản trình tối ưu hóa của cơ sở, với 11 giá trị không nên đưa ra vấn đề đó.

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