代码之家  ›  专栏  ›  技术社区  ›  Ori Marko

Oracle-不能在select子句中对其他列使用*号

  •  2
  • Ori Marko  · 技术社区  · 6 年前

    很抱歉,如果很琐碎,请选择列 * 标志不总是有效的,我找不到这种行为的参考。

    我可以选择桌子 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 回复  |  直到 5 年前
        1
  •  6
  •   Aleksej    6 年前

    文档中没有这么清楚地说明这个限制,但是您可以通过以下方法找到它 this diagram 是的。

    enter image description here

    这里你可以看到如果你使用 * ,您不能在选择列表中使用任何其他内容

        2
  •  3
  •   Alex Poole    6 年前

    这个 syntax diagram for select 显示:

    enter image description here

    最外面的那条路是平坦的,没有固定的 * 所有列通配符本身,并且没有其他列表达式的循环-所有带有逗号(用于分隔术语)的路径都与普通路径不同 * 路径。

    在内心深处 允许使用逗号,因此只能使用多个表达式 .* 前缀是表/视图/别名,然后可以跟在其他表达式后面(或前面)。

    (我真的认为这是在某个地方说得更清楚了,但我在最近的文档中找不到它……)

    为什么我必须用化名*签名?

    select col,aa.* from A aa;
    

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

    select col,A.* from A;
    

    有一种观点认为,无论如何都不应该使用通配符,至少对于除特殊查询之外的任何查询都不应该使用通配符-最好显式列出所有必需的列名,并以适当的表名/别名作为前缀,特别是在有联接的情况下,这样做可以更清楚,并且避免修改表时出现意外问题。不过,这完全超出了这个问题的范围*8-)

        3
  •  1
  •   William Robertson    6 年前

    为什么这些错误如此误导人?

    错误是正确的。他们只是不知道你想干什么。之后

    select *
    

    下一个关键字应该是 from ,所以其他任何东西

    FROM keyword not found where expected
    

    之后 , 应该有一个有效的表达式,例如列名,而不是 * 这是出乎意料的,所以你会

    ORA-00936: missing expression
    

    如果oracle写一条关于错误使用 * 但是到目前为止还没有。你可以在 Oracle Database Ideas 论坛。