2017-02-19 4555 views
2

我得知我應該爲所有列添加別名,並且我正在這樣做,但仍然出現錯誤。ORA-00998:必須用列別名命名該表達式

CREATE TABLE MENTIONS AS SELECT 
    UM.USER_ID AS U_ID, 
    UM.SCREEN_NAME AS USER_SCREEN_NAME, 
    UM.MENTION_ID AS M_USER_ID, 
    (
     SELECT 
      UI.USER_SCREEN_NAME AS MENTIONED_USER 
     FROM 
      USER_INFO UI 
     WHERE 
      UI.USER_ID = UM.MENTION_ID 
     AND ROWNUM = 1 
    ) 
FROM 
    USER_MENTION UM 

USER_MENTION表

USER_ID  SCREEN_NAME MENTION_ID 
135846337 irisschrijft  774759032636727300 
50117969 Chjulian   13769472 
14411827 thenriques45  13769472 
26681613 ahenotri  252074645 
26681613 ahenotri   9796472 
158378782 SpringerOpen 9796472 
144241914 Kumarappan  252074645 

USER_INFO表:

USER_ID  USER_SCREEN_NAME 
22553325 jasonesummers 
23435691 QRJAM false 
67421923 inTELEgentMSP 
97393397 knauer0x  
85303739 MarriageTheorem 
3842711  seki  
3036414608 Bayes_Rule 
838677852 BOLIGATOR 

我仍然得到上述的錯誤,我究竟做錯了什麼?

+2

你的子查詢的結果沒有別名。 –

+1

嘗試將MENTIONED_USER移動到子查詢末尾之外? – jarlh

+0

您正在創建一個表格。該列需要有一個名稱。 –

回答

7

查找Oracle Error Message Manual of the current Oracle version。這裏提到的錯誤,但沒有額外的信息。

在這種情況下仰望 Oracle Error Message Manual of version 9i 因爲我不知道很多錯誤信息在9i的說明書的描述而不是在更高版本的手冊原因。 9i是一個相當老的版本,所以描述可能會過時。但它可能包含有價值的提示。

ORA-00998必須指定一個列別名
導致此表達:在CREATE VIEW語句中使用的表達或功能,但是沒有指定相應的列名。在視圖中使用表達式或函數時,必須在CREATE VIEW語句中明確指定視圖的所有列名稱。
操作:在視圖名稱後面的括號中輸入視圖中每列的列名稱。

我們沒有視圖,而是由select創建的表。實際上,選擇列表的最後一個表達式是沒有別名的表達式。因此,請嘗試使用最後一個表達式的別名。所以試試

CREATE TABLE MENTIONS AS SELECT 
    UM.USER_ID AS U_ID, 
    UM.SCREEN_NAME AS USER_SCREEN_NAME, 
    UM.MENTION_ID AS M_USER_ID, 
    (
     SELECT 
      UI.USER_SCREEN_NAME 
     FROM 
      USER_INFO UI 
     WHERE 
      UI.USER_ID = UM.MENTION_ID 
     AND ROWNUM = 1 
    ) AS MENTIONED_USER 
FROM 
    USER_MENTION UM 

內部選擇列表中的列別名是無用的,可以刪除。

2

查詢的問題是create table中的每列都需要有一個名稱。你認爲你在子選擇中分配了一個名字。但是,你不是。

子查詢只是返回一個值 - 不是名稱的值。所以,你的版本中的AS MENTIONED_USER什麼都不做。我猜,這有點棘手。考慮標量子查詢的一種方法是它只是另一個表達式或函數調用。在它內部發生的事情不會影響外部查詢 - 除了返回的值。

正確的語法是把列別名子選擇,而不是裏面它:

CREATE TABLE MENTIONS AS 
    SELECT UM.USER_ID AS U_ID, UM.SCREEN_NAME AS USER_SCREEN_NAME, UM.MENTION_ID AS M_USER_ID, 
      (SELECT UI.USER_SCREEN_NAME 
      FROM USER_INFO UI 
      WHERE UI.USER_ID = UM.MENTION_ID AND ROWNUM = 1 
      ) AS MENTIONED_USER 
    FROM USER_MENTION UM;