如何在Oracle中使用'as'关键字给一个表取别名?

21

我试图在Oracle SQL Developer中执行这个查询:

SELECT G.Guest_ID, G.First_Name, G.Last_Name
FROM Guest AS G
  JOIN Stay AS S ON G.Guest_ID = S.Guest_ID
WHERE G.City = 'Miami' AND S.Room = '222';

然而,我得到了以下错误:

ORA-00933: SQL command not properly ended
00933. 00000 - "SQL command not properly ended"
*Cause:
*Action:
Error at Line: 2 Column: 12

我在第二行中没有看到任何问题,错误信息也不是很具有描述性。它似乎与 as 关键字有关。如果我将其删除,则可以正常工作。然而,我希望我的查询非常详细。因此,我必须找出一种方法来修复问题,而不是删除 as 关键字。

这是涉及的表格结构:

CREATE TABLE GUEST
(
  GUEST_ID       NUMBER               NOT NULL,
  LAST_NAME      VARCHAR2(50 BYTE),
  FIRST_NAME     VARCHAR2(50 BYTE),
  CITY           VARCHAR2(50 BYTE),
  LOYALTY_NUMBER VARCHAR2(10 BYTE)    
);

CREATE TABLE STAY
(
  STAY_ID        NUMBER                         NOT NULL,
  GUEST_ID       NUMBER                         NOT NULL,
  HOTEL_ID       NUMBER                         NOT NULL,
  START_DATE     DATE,
  NUMBER_DAYS    NUMBER, 
  ROOM           VARCHAR2(10 BYTE)
);

提前感谢任何帮助。


也许你来自 SQL Server 的经验背景。与 SQL Server 不同的是,在 Oracle SQL 中,要为表设置别名只需要像 @dystroy 所回答的那样使用别名即可。 - Birupakhya Dash
@justCallMeBiru 在大多数系统中,你可以使用AS,但这是可选的。 - Denys Séguret
在 ANSI SQL 标准中,使用 AS 关键字作为表别名不是标准用法。 - Lalit Kumar B
2个回答

35

在许多 SQL 服务器上(至少是 MsSQL、MySQL 和 PostrgreSQL),您可以使用 AS 进行表别名,但这始终是可选的,在 Oracle 上则是非法的。

因此,请删除 AS

SELECT G.Guest_ID, G.First_Name, G.Last_Name
FROM Guest G

2
@Marcos,Oracle并不是MSSQL。 - Denys Séguret
4
在from子句中使用“as”的可能性不是标准(ANSI)SQL。 Oracle不能因Microsoft未遵守标准而受到责备。 - Ronald
5
Oracle的SELECT [table_reference]文档中在t_alias之前没有显示AS;相比之下,[select_list]清楚地显示了(可选的)ASc_alias之前。因此,文档确实说明了对于列别名是允许的,但并没有说明对于表别名也是允许的,因此不被允许。 - Alex Poole
1
@DylanChen 是的,针对列别名,而不是表别名。 - Denys Séguret
1
在这种情况下,Oracle不符合标准。在大多数实现中,使用“AS”作为表别名是标准SQL,并得到支持。我从未找到过Oracle不支持它的原因。我猜他们在过去的40年里总是有更高优先级的工作要做! - Bill Karwin
显示剩余9条评论

1
在Oracle中,省略表别名的AS关键字。
SELECT G.Guest_ID, G.First_Name, G.Last_Name
FROM Guest G
  JOIN Stay S ON G.Guest_ID = S.Guest_ID
WHERE G.City = 'Miami' AND S.Room = '222';

这将为您提供无错误的输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接