Подтвердить что ты не робот

Действительный запрос GROUP BY не работает в сочетании с INSERT INTO в Oracle

Я пытаюсь написать INSERT INTO, который выполняет некоторую работу DISTINCT/GROUP BY. Запрос выполняется отлично, как оператор select, но не будет работать, если он завернут в INSERT INTO.

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

Это меня заводит:

Ошибка SQL: ORA-00979: не выражение GROUP BY

Но если я удалю только код INSERT INTO, он работает отлично:

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

Результаты:

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

Мое предположение заключается в том, что GROUP BY не допускаются внутри операторов INSERT INTO, но я не могу найти почти никакой документации, подтверждающей это.

4b9b3361

Ответ 1

Я думаю неправильно, но не соответствует ли sql тем, что вы хотите достичь?

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

Ответ 2

Удивительно, если это порядок выполнения проблемы... это работает, если вы используете CTE? CTE должен сначала материализоваться, таким образом, разрешить группу...

  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

или... почему предложение group by и where в первую очередь не делает ничего, поскольку recordID не является агрегатом и не является частью группы с помощью...

Вставить в masterRecords (batchrecordRecordID, SourceID, BatchID) SELECT recordID, 101, 150 из batchRecords

Ответ 3

Проблема решается путем автоматического изменения значения параметра (optimizer_features_enable). Это значение определяет версию оптимизатора базы, при этом 11 не должна давать этой проблемы.