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