我正在尝试编写一个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不应该出现这个问题。