为什么在Oracle SQL中选择指定的列,而且全部错误?

时间:2010-02-23 00:17:36

标签: sql oracle table-alias ora-00936

说我有一个选择语句..

select * from animals

它给出了表中所有列的查询结果。

现在,如果表animals的第42列是is_parent,并且我想在结果中返回,gender之后,那么我可以更轻松地看到它。但我也想要所有其他专栏。

select is_parent, * from animals

返回ORA-00936: missing expression

同样的语句在Sybase中可以正常工作,我知道你需要在animals表中添加一个表别名才能使它工作(select is_parent, a.* from animals ani),但为什么< / em> Oracle是否需要一个表别名才能计算出选择?

7 个答案:

答案 0 :(得分:21)

实际上,解决原始问题很容易。你只需要符合*。

select is_parent, animals.* from animals;

应该工作得很好。表名的别名也有效。

答案 1 :(得分:2)

在生产代码中执行此操作没有任何价值。我们应该明确命名我们想要的列,而不是使用SELECT *构造。

至于即席查询,请自己学习IDE - SQL Developer,TOAD,PL / SQL Developer等 - 它允许我们操作查询和结果集,而无需扩展SQL。

答案 2 :(得分:2)

到目前为止,关于为什么select *不应该被使用而且它们都完全正确的答案很多。但是,不要认为它们中的任何一个都回答了原始问题,即特定语法失败的原因。

可悲的是,我认为原因是......“因为它没有”。

我认为这与单表与多表查询无关:

这很好用:

select *
from
    person p inner join user u on u.person_id = p.person_id

但这失败了:

select p.person_id, *
from
    person p inner join user u on u.person_id = p.person_id

虽然这有效:

select p.person_id, p.*, u.*
from
    person p inner join user u on u.person_id = p.person_id

这可能与20年前的遗留代码有一些历史兼容性。

另一个为“买为什么!!!”桶,以及why can't you group by an alias

答案 3 :(得分:2)

好问题,我经常自己想知道这件事,但后来接受了它作为其中一件事......

类似的问题是:

sql>select geometrie.SDO_GTYPE from ngg_basiscomponent

ORA-00904: "GEOMETRIE"."SDO_GTYPE": invalid identifier

其中geometrie是mdsys.sdo_geometry类型的列。

添加一个别名,这件事就可以了。

sql>select a.geometrie.SDO_GTYPE from ngg_basiscomponent a;

答案 4 :(得分:1)

别名。*格式的用例如下

select parent.*, child.col
from parent join child on parent.parent_id = child.parent_id

即,从连接中的一个表中选择所有列,再加上(可选)其他表中的一个或多个列。

您可以使用它来选择相同的列两次只是一个副作用。选择同一列两次没有任何意义,我不认为懒惰是一种真正的理由。

答案 5 :(得分:1)

现实世界中的

Select *只有在检索后通过索引号而不是名称引用列时才会发生危险,当结果集中不需要所有列时,更大的问题是效率低(网络流量,CPU和内存)加载)。 当然,如果你要从其他表中添加列(就像在这个例子中的情况那样,它可能是危险的,因为这些表可能随着时间推移具有匹配名称的列,select *, x在这种情况下如果列x是添加到以前没有它的表中。

答案 6 :(得分:0)

  

为什么 Oracle必须有一个表别名才能计算出选择

Teradata要求相同。由于两者都很老(可能更好地称之为成熟 :-) DBMSes这可能是历史原因。

我通常的解释是:一个不合格的*意味着所有/所有列并且解析器/优化器很容易混淆,因为您要求多于所有。< / p>