我知道我应该在所有列中添加别名而我正在这样做但我仍然会收到错误。
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
我仍然遇到上述错误,我做错了什么?
答案 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;