1

我正在尝试为表构造和内部连接中的表成员提供别名,以便我可以在这样的选择中的子查询中使用它

    SELECT description,
       Avg((SELECT Count(*)
            FROM   facturation F
            WHERE  F.membreid = M.membreid))
FROM   v_type_membre
       INNER JOIN v_membre M
               ON v_type_membre.typeid = M.typeid
       INNER JOIN v_facturation
               ON M.membreid = v_facturation.membreid
GROUP  BY description
ORDER  BY description; 

为什么我会收到错误消息:

Error at Command Line:3 Column:31
Error report:
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:

谢谢

4

2 回答 2

2

您最初的问题是别名周围的引号。你不需要它们。

同样,您不需要相关子查询。您可以将查询编写为:

select description, avg(cnt*1.0) as avg_cnt
FROM v_type_membre INNER JOIN v_membre M
     ON v_type_membre.typeid = M.typeid INNER JOIN
     v_facturation
     ON M.membreid = v_facturation.membreid inner join
     (SELECT f.membreid, Count(*) as cnt
      FROM facturation F
      group by F.membreid
     ) cnt
     on cnt.membreid = M.membreid
GROUP  BY description
ORDER  BY description;  

除了更清晰(在某些人看来)之外,这还允许您包含最小值和最大值,或者根据需要计算值是 10 和 42 的次数。

我还添加了一个“*1.0”来将计数转换为浮点数。在某些数据库中,整数的平均值是整数,这可能不是您想要的。Oracle 的平均值是正确的,但我有这样做的习惯。

于 2012-05-31T20:34:47.683 回答
1

尝试将子选择移动到连接(我认为您不需要 v_facturation 连接,我需要更多信息(我猜 v_* 是一个视图)来确定。);

SELECT description, Avg(F.fact_cnt)
FROM   v_type_membre
       INNER JOIN v_membre AS M
               ON v_type_membre.typeid = M.typeid
--       INNER JOIN v_facturation
--               ON M.membreid = v_facturation.membreid
       INNER JOIN (SELECT membreid, Count(*) 'fact_cnt'
            FROM   facturation group by membreid) AS F
            ON  F.membreid = M.membreid
GROUP  BY description
ORDER  BY description;

(抱歉,目前没有 Oracle 或任何其他可用的数据库,这都是在我的脑海中解析和编译的......)

于 2012-05-31T20:35:30.023 回答