Sql 别名在内部联接中不起作用
我试图为表factouring和内部联接中的表成员提供一个别名,以便在select中的子查询中使用它,如下所示Sql 别名在内部联接中不起作用,sql,oracle,inner-join,Sql,Oracle,Inner Join,我试图为表factouring和内部联接中的表成员提供一个别名,以便在select中的子查询中使用它,如下所示 SELECT description, Avg((SELECT Count(*) FROM facturation F WHERE F.membreid = M.membreid)) FROM v_type_membre INNER JOIN v_membre M
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:
谢谢您最初的问题是别名周围的引号。你不需要它们 类似地,您不需要相关子查询。您可以将查询编写为:
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计算平均值是正确的,但我有这样做的习惯。尝试将子选择移动到联接。我认为您不需要v_factoration联接,我需要更多信息,我猜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或任何其他数据库可用,这些都是在我的头脑中解析和编译的…删除别名周围的引号。您指定了一个常量值而不是别名。是否也从from子句的表中删除了它?完成后,您应该在问题中编辑您的查询。谢谢!但我有另一个错误SQL错误:ORA-00904:F.MEMBREID:无效标识符。但我不明白,因为membreid是表构造的一个属性,甚至SQLDeveloper的intellisense也能识别它。错误在于连接标准。我换了f。与cnt…谢谢!你就是那个男人:别再犯错误了。最后一个问题是,为什么使用cnt作为计数别名和查询别名?没有特别的原因。我不想使用f,因为它指的是表。正常情况下,我可能会放一些类似fsum的东西,但在这个例子中,它是cnt。