我在存储过程中定义了一系列表,最终像这样返回到应用程序,然后最终形成一个简单的表,该表包含与先前定义的表不同的值以及该不同值重复的次数。出于某种原因,它似乎没有工作......
...存储过程...
OPEN p_retcursor FOR
WITH r AS
(SELECT ...
FROM MYDATATABLE),
s AS
(SELECT ...
FROM r
WHERE ...)
,
t AS
(SELECT ...
WHERE ...
JOIN ...
ON ...
FROM s)
SELECT t.*, COUNT(*) as distinctABcount
FROM t
GROUP BY t.columnA, t.columnB
我如何让它工作?我猜从技术上讲 columnA 和 columnB 不是表的列,而是 t 的列所以我认为评估的顺序有点混乱,因为 t 不是实际的表......查询在计数附近失败( *) 列部分并且可能在 GROUP BY 上失败。
谢谢。
更新 1:我有一个理论,如果我将所有命名的表串在一起到 from 子句内的子查询中,它将起作用......但是考虑到这个存储过程有数百行长,这似乎不是一个可以产生可读代码的解决方案...
更新 2:
理论是错误的,派生表不是问题,但正如答案所指出的,你不能要求比你在 group by 子句中设置的列更多的列。我通过按照建议更正查询的最后部分来修复它:
select t.columnA, t.columnB, COUNT(*) as distinctABcount
FROM t
GROUP BY t.columnA, t.columnB
正确运行。
除非有特定于 Oracle 语法的内容,否则我怀疑您的派生表中的 columnA 和 columnB 不止一个
t
。如果是这样,您需要按这些列进行分组,对它们应用聚合或不要求它们(将 t.* 替换为 t.columnA、t.columnB)