ORA-00998:必须使用列别名命名此表达式

时间:2017-02-19 11:03:12

标签: sql oracle

我知道我应该在所有列中添加别名而我正在这样做但我仍然会收到错误。

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 个答案:

答案 0 :(得分:8)

查找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

内部选择列表中的列别名无用,可以删除。

答案 1 :(得分: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;