Ответ 1
Я думаю неправильно, но не соответствует ли sql тем, что вы хотите достичь?
INSERT INTO MasterRecords(BatchRecordRecordID, SourceID, BatchID)
SELECT DISTINCT RecordID, 101, 150
FROM BatchRecords
WHERE BatchID = 150
;
Я пытаюсь написать 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, но я не могу найти почти никакой документации, подтверждающей это.
Я думаю неправильно, но не соответствует ли sql тем, что вы хотите достичь?
INSERT INTO MasterRecords(BatchRecordRecordID, SourceID, BatchID)
SELECT DISTINCT RecordID, 101, 150
FROM BatchRecords
WHERE BatchID = 150
;
Удивительно, если это порядок выполнения проблемы... это работает, если вы используете 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
Проблема решается путем автоматического изменения значения параметра (optimizer_features_enable). Это значение определяет версию оптимизатора базы, при этом 11 не должна давать этой проблемы.