我陷入了一种方式,即如何对列进行求和,比如说表的第一列(来自另一个查询的结果),而不知道列名和列位置 id 之类的东西。
是这样的
select sum(what?), employID from
( select count(*), employID from table1...
union all
select count(*), employID from table2...
union all
select count(*), employID from table3...
)
或者,如果它在单个查询中(使用 sum() 的单个简单选择查询),例如:
select employName, sum(what?), employID from tableX
如何告诉 SUM() 函数根据表中的列位置索引求和SUM(2)
?
注意:我不想使用列别名,是否有可能不基于列名进行 SUM?
我知道我可以使用列名或别名,但我真的想知道不使用这些的可能性,这就是我问这个问题的原因,如果没有可能的方法,我会接受“否”作为正确答案。
许多(也许是大多数)其他数据库产品不允许您使用没有明确指定别名的计算列定义派生表。换句话说,他们不会让你拥有这个
相反,您必须执行以下操作:
原因是,它们不会自动为表达式分配名称。相反,Oracle 会这样做,这就是为什么当您的派生表有一个没有显式别名的计算列时 Oracle 很好的原因。该列将具有默认名称。唯一的问题是,该名称将是什么。
基本上,名称就是表达式本身,但 Oracle 在将其用作名称之前会对原始表达式应用某些转换。特别是,所有未加引号的标识符(包括函数名称)都是大写的,并且所有空格都被删除。因此,如果表达式为
count(*)
,则列的默认名称变为COUNT(*)
。如果表达式为a + 1
,则默认名称为A+1
。请注意,这两个示例中的特殊符号 ((
,*
,)
,+
) 规定您将名称括在引号中以便能够将其用作参考。换句话说,如果您有这样的派生表:那么你必须写
而不是
如果要引用派生表的列;否则,Oracle 将不将引用解释为引用,而是将其解释为实际表达式(COUNT 函数的另一个调用,这次应用于派生表的输出)。
因此,在您的具体示例中,您可以将派生表的第一列引用为
"COUNT(*)"
:也就是说,为什么要避免显式分配别名?通常这不是关于你想如何做事,而是关于事情应该如何做。此外,如果
AS name
由于某种原因在表达式之后立即使用是不可接受的,那么您还有其他分配列别名的选项,如ypercubeᵀᴹ 的答案中所建议的那样。在标准 SQL 中添加别名(用于派生表及其列)的另一种方法是(不幸的是,它尚未在 Oracle 中实现):
不过,您可以使用类似的结构,即 CTE,它适用于最新版本的 Oracle(11+):
您需要通过使用别名来重写您的查询
不,使用列别名。
作为最佳实践,请始终使用列别名。