说我有去..

select语句
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),但为什么的必须甲骨文需要的表别名,以便能够计算出所述选择?

有帮助吗?

解决方案

其实,这是容易解决原来的问题。你只需要限定*。

select is_parent, animals.* from animals;

应该只是罚款。为表名称别名也工作。

其他提示

有处于生产代码这样做没有什么优点。我们应该明确命名我们希望在列,而不是使用SELECT *结构。

对于即席查询,让自己的IDE - SQL开发,TOAD,PL / SQL开发人员,等等 - 这使我们能够处理查询和结果集,而无需扩展SQL。

好问题,我常常这样想自己,但有那么接受它的那些事情之一......

类似的问题是这样的:

sql>select geometrie.SDO_GTYPE from ngg_basiscomponent

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

其中几何学的类型是MDSYS.SDO_GEOMETRY的柱中。

添加一个别名,那东西的作品。

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

到目前为止为什么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岁的遗留代码,一些历史兼容性的事情。

另一个为“买入为什么!!!”斗,与沿着你为什么不能由一个组别名

在用例的别名。*格式如下

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

也就是说,从一个表中选择的所有列中加入,加(任选地)一个或多个从其他表中的列。

这可以用它来选择同一列两次的事实仅仅是一个副作用。有没有真正的点两次选择同一列,我不认为懒惰是真正的理由。

检索之后而不是名称参照列时通过索引号在现实世界中

Select *仅危险,更大的问题是,当在结果中并不需要所有的列(网络流量,CPU和存储器负荷)低效率。 当然,如果你从其他表添加列(如本例中的情况下,它可能是危险的,因为这些表可能会随着时间的推移有相匹配的名字列,如果列x被添加到表select *, x在这种情况下会失败先前没有它。

  

为什么必须甲骨文需要一个表的别名,以便能够制定出选择

的Teradata被需要相同。由于两者都是很旧的(也许更好叫它的成熟的:-)的DBMS,这可能是历史原因。

我通常的解释是:不合格的*手段的家居/所有列的和解析器/优化仅仅是困惑,因为你要求的超过一切

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top