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

标签 sql oracle oracle12c

我正在尝试编写一个 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,但我几乎找不到任何文件证实这一点。

最佳答案

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

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

我将 NO_QUERY_TRANSFORMATION 提示应用于“intoed” SELECT 语句,错误消失了。

在这个问题的情况下,我应该将其重写为:

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 - 在 Oracle 上与 INSERT INTO 结合使用时,有效的 GROUP BY 查询不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28354248/

相关文章:

sql - Oracle:即使没有约束或索引,重命名列也会出现 "ORA-00903: invalid table name"错误

sql - oracle 12c - 选择最后一次出现字符后的字符串

c# - 将 NULL 值传递给 LINQ 中的日期时间字段

oracle - ORA-04036 : PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT

sql - 检查时间是否在两次之间

oracle - 安装 Oracle Apex 时出错

java - Spring Boot schema.sql,使用PL/SQL初始化数据库

php - MySQL 查询多个 LEFT Joins 问题

SQL WHERE、OR 和 AND

mysql查询以降序从表中减去