2010-02-23 78 views
20

說我有去的select語句..爲什麼選擇指定的列,和所有的,錯的Oracle SQL?

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),但爲什麼必須甲骨文需要一個表的別名,以便能夠制定出選擇?

+0

感謝您提出這個問題。我正在從SQL Server轉換到Oracle。我看到同樣的錯誤。 – user3454439 2017-04-21 01:46:12

回答

17

其實,這是容易解決原來的問題。你只需要限定*。

select is_parent, animals.* from animals; 

應該工作得很好。表名的別名也起作用。

+0

我永遠不會在生產代碼中放置「*」,但這是我需要的工作。我正在做一些「狩獵」,並嘗試像選擇(ColA ||','|| ColB)作爲「CompoundPK」,從MYTABLE *。感謝別名解決方法。給予好評。 – granadaCoder 2013-04-08 15:01:19

1

的用例的別名。*格式如下

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

即,在一個連接從一個表中選擇的所有列,以及(任選地)一個或多個從其他表中的列。

,你可以用它來選擇同一列兩次時,這只是一個副作用。兩次選擇同一欄目並沒有真正的意義,我不認爲懶惰是一個真正的理由。

+1

我知道,如果您使用多個表來定義哪一個返回所有列,但我想知道爲什麼Oracle無法確定當我選擇了哪個表時,我的意思是什麼表。此外,我發現在調試時使用的'select column * *'節省了時間,與試圖複製列並將其移植到Excel中相比,手動移動列可能會導致數據列不匹配。 – glasnt 2010-02-23 04:23:25

2

有在生產代碼中這樣做沒有任何好處。我們應該明確指定我們想要的列,而不是使用SELECT *構造。

對於即席查詢,讓自己的IDE - SQL開發,TOAD,PL/SQL開發人員,等等 - 這使我們能夠處理查詢和結果集,而無需擴展SQL。

+2

在現實世界中選擇*確實是危險的。在添加列和在過程中使用'*'之前,我已經被捕獲了。但是,對於特別查詢,我的發言完全有效。 – glasnt 2010-02-23 04:25:13

1

Select *在現實世界中,只有在檢索後按索引號而不是按名稱引用列時,危險性纔會很大,當結果集中不需要所有列(網絡流量,cpu和內存負載)時,更大的問題是效率低下。 當然,如果你從其他表添加列(如本例中的情況下,它可能是危險的,因爲這些表可能會隨着時間的推移有相匹配的名字列,如果列x被添加到select *, x在這種情況下會失敗表格,以前沒有它

2

很多好的答案,迄今爲什麼select *不應該使用,他們都是完全正確的。但是,不要認爲他們中的任何人回答原來的問題,爲什麼特定的語法失敗。

可悲的是,我想原因是......「因爲它沒有」。

我不認爲這是什麼做單TA可愛vs.多表查詢:

這工作得很好:

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

+1

負面是有點苛刻。我認爲只有雷內和我自己迄今已經回答了所問的問題。所有其他答案只是說不應該使用「select *」。 – 2010-02-24 22:23:39

2

好問題,我常常這樣想自己,但有那麼接受它的那些事情之一......

類似的問題是這樣的:

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; 
0

爲什麼必須甲骨文需要一個表的別名,以便能夠制定出選擇

Teradata的要求是相同的。由於兩者都很老舊(也許最好叫它成熟 :-) DBMS這可能是歷史原因。

我通常的解釋是:不合格*意味着一切/所有列和解析器/優化,因爲你要求重於一切更是一頭霧水。

相關問題