别名不在内连接中工作

时间:2012-05-31 20:22:52

标签: sql oracle inner-join

我正在尝试给表facturation和内连接中的表成员一个别名,所以我可以在select这样的子查询中使用它

    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:

谢谢

2 个答案:

答案 0 :(得分: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正确地做了平均值,但我习惯这样做。

答案 1 :(得分: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或任何其他目前可用的数据库,这都是在我脑海中解析和编译的......)