Oracle-不能在选择子句中的其他列上使用*符号

时间:2018-07-04 07:40:09

标签: oracle select

抱歉,这很琐碎,但是选择带有*符号的列并不总是有效,而且我找不到这种行为的引用。

我可以使用以下语句选择表A和列col

select * from A;select col from A;select aa.col,aa.* from A aa;

但是我不能一起查看:

select *,col from A;

将导致错误ORA-00923: FROM keyword not found

select col,* from A aa;

将导致错误ORA-00936: missing expression

为什么我必须对*符号使用别名?

select col,aa.* from A aa;

为什么错误如此令人误解?

3 个答案:

答案 0 :(得分:6)

文档中没有对限制进行明确说明,但是您可以按照this diagram进行查找。

enter image description here

在这里,您看到如果使用*,则选择列表中将无法使用其他任何内容

答案 1 :(得分:3)

syntax diagram for select显示:

enter image description here

最外面的路径本身显示了普通的,无前缀的*全列通配符,并且没有循环返回其他列表达式-所有带有逗号(以单独的术语表示)的路径都是不同的从那条简单的*路径开始。

允许的内部路径上,因此允许使用多个表达式,因此只能使用以表/视图/别名为前缀的.*,然后可以跟随(或在前面) )与其他表达式。

(我真的以为在某个地方可以更清楚地说明这一点,但是我在最近的文档中都找不到它...)

  

为什么我必须对*符号使用别名?

select col,aa.* from A aa;

那不是相当准确;您不必使用别名,如果没有别名,则可以直接使用表名,因此这也是有效的:

select col,A.* from A;

有种思路,无论如何,至少不应该使用通配符,除非是临时查询,否则最好不要使用通配符-最好明确列出所有必需的列名,并以适当的表名/别名为前缀如果存在联接,则为清楚起见并避免修改表时出现意外问题。 * 8-)

答案 2 :(得分:1)

  

为什么错误如此令人误解?

错误是正确的。他们只是猜不到您要做什么。之后

select *

下一个关键字应为from,因此其他任何内容都会提供

FROM keyword not found where expected

,之后,应该有一个有效的表达式,例如列名,而不是*,这是意外的,所以您得到

ORA-00936: missing expression

如果Oracle编写了有关错误使用*的特殊错误消息,也许很好,但是到目前为止,还没有。您可以在Oracle Database Ideas论坛上提出建议。