说我有一个选择语句..
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是否需要一个表别名才能计算出选择?
答案 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>