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



我正在尝试编写一个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

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

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

在我的例子中,避免了任何优化器转换,实现了这个技巧。

我对"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

我是不是想错了,但下面的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不是聚合,也不是group-by-的一部分

插入主记录(batchrecordRecordID、SourceID、BatchID)从batchRecords 中选择记录ID,101150

问题通过自动更改参数(optimizer_features_enable)的值来解决。这个值决定了基础的优化器版本,11不应该出现这个问题。

相关内容

  • 没有找到相关文章

最新更新