与 Oracle 上的 INSERT INTO 结合使用时,有效的 GROUP BY 查询不起作用

Valid GROUP BY query doesn't work when combined with INSERT INTO on 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 Error: ORA-00979: not a GROUP BY expression

但是如果我只删除 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

我的假设是 INSERT INTO select 语句中不允许使用 GROUP BY,但我几乎找不到证实这一点的文档。

想知道这是否是执行顺序问题...如果您使用 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 不是聚合并且不属于 group by...

插入 masterRecords(batchrecordRecordID、SourceID、BatchID) SELECT 来自 batchRecords 的记录 ID、101、150

我是不是想错了,下面的sql不就是你想要的吗?

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

问题已通过自动更改参数值(optimizer_features_enable)解决。这个值决定了base的优化器版本,用11应该不会出那个问题。

我来到这里试图解决类似的情况,所以在我看来,这种问题仍然存在。

就我而言,避免任何优化器转换就成功了。

我对 "intoed" SELECT 语句应用了 NO_QUERY_TRANSFORMATION 提示,错误消失了。

对于这道题,我应该改写为:

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