Oracle 创建视图时抛出 SQL 错误

Posted

技术标签:

【中文标题】Oracle 创建视图时抛出 SQL 错误【英文标题】:Oracle Throwing SQL Error when creating a View 【发布时间】:2009-04-08 16:55:45 【问题描述】:

我正在尝试在 Oracle 数据库中创建视图,但不断收到 ORA-00907 错误(缺少右括号)。我的 SQL 如下:

CREATE VIEW my_view AS 
(
SELECT metadata.ID,metadata.Field1,metadata.Field2,metadata.Field3,metadata.Field4,attribute1.StrValue AS Attr1, attribute2.StrValue AS Attr2 
FROM metadata,data AS attribute1,data AS attribute2 
WHERE 
    (
    metadata.Type = 'TYPE1'
    ) 
AND 
    (
    metadata.ID = attribute1.ID AND attribute1.name = 'attr1'
    ) 
    AND 
    (
    metadata.ID = attribute2.ID AND attribute2.name = 'attr2'
    )
)

表元数据定义实体,数据定义这些实体的属性。

这在 MS SQL 和 mysql 中运行良好,但我不断收到来自 Oracle 的上述错误。

没有与 Oracle 合作太久,所以我不太了解它的怪癖。

【问题讨论】:

【参考方案1】:
CREATE VIEW my_view AS 
(
SELECT  metadata.ID,metadata.Field1,metadata.Field2,
        metadata.Field3,metadata.Field4,
        attribute1.StrValue AS Attr1, attribute2.StrValue AS Attr2 
FROM    metadata, data /* No AS here */ attribute1,
        data /* No AS here */ attribute2 
WHERE 
        (
        metadata.Type = 'TYPE1'
        ) 
AND 
        (
        metadata.ID = attribute1.ID AND attribute1.name = 'attr1'
        ) 
        AND 
        (
        metadata.ID = attribute2.ID AND attribute2.name = 'attr2'
        )
)

我删除了dataattribute1 之间的AS

【讨论】:

【参考方案2】:

您需要删除 FROM 子句中的 AS。 Oracle 允许使用可选的 AS 为列名添加别名,但不允许提供别名

SQL> ed
Wrote file afiedt.buf

  1  CREATE VIEW my_view AS
  2  (
  3  SELECT metadata.ID,metadata.Field1,metadata.Field2,metadata.Field3,metadata
.Field4,attribute1.StrValue AS Attr1, attribute2.StrValue AS Attr2
  4  FROM metadata,data attribute1,data attribute2
  5  WHERE
  6          (
  7          metadata.Type = 'TYPE1'
  8          )
  9  AND
 10          (
 11          metadata.ID = attribute1.ID AND attribute1.name = 'attr1'
 12          )
 13          AND
 14          (
 15          metadata.ID = attribute2.ID AND attribute2.name = 'attr2'
 16          )
 17* )
SQL> /

View created.

根据您使用的工具,了解 SQL*Plus 会准确显示语法错误发生的位置可能很有用——下面的 sn-p 显示它反对 AS 关键字。

SQL> ed
Wrote file afiedt.buf

  1  CREATE VIEW my_view AS
  2  (
  3  SELECT metadata.ID,metadata.Field1,metadata.Field2,metadata.Field3,metadata
.Field4,attribute1.StrValue AS Attr1, attribute2.StrValue AS Attr2
  4  FROM metadata,data AS attribute1,data AS attribute2
  5  WHERE
  6          (
  7          metadata.Type = 'TYPE1'
  8          )
  9  AND
 10          (
 11          metadata.ID = attribute1.ID AND attribute1.name = 'attr1'
 12          )
 13          AND
 14          (
 15          metadata.ID = attribute2.ID AND attribute2.name = 'attr2'
 16          )
 17* )
SQL> /
FROM metadata,data AS attribute1,data AS attribute2
                   *
ERROR at line 4:
ORA-00907: missing right parenthesis

【讨论】:

【参考方案3】:

既然你的括号都不是必需的,而且它们使阅读代码变得更加困难,为什么不去掉它们呢?

【讨论】:

这不是双亲,而是很好的 Oracle 语法解析器报告错误的方式。 Oracle 无法识别表名和别名之间的 AS。【参考方案4】:

其他人指出您的 FROM 子句中的 AS 关键字是问题所在。我建议以下作为同一语句的更清晰、更易于阅读的版本:

create view my_view as 
select
  meta.id
 ,meta.field1
 ,meta.field2
 ,meta.field3
 ,meta.field4
 ,att1.strvalue as attr1
 ,att2.strvalue as attr2 
from
  metadata meta
 ,data att1
 ,data att2 
where meta.id = att1.id 
  and meta.id = att2.id 
  and meta.type = 'TYPE1'
  and att1.name = 'attr1'
  and att2.name = 'attr2'

【讨论】:

以上是关于Oracle 创建视图时抛出 SQL 错误的主要内容,如果未能解决你的问题,请参考以下文章

@ViewBuilder 在使用其他属性初始化时抛出错误

IBExpert 中的 Firebird 在访问某些存储过程时抛出错误

视图设置为 inputAccessoryView 在添加回普通视图时抛出异常

创建表时抛出错误

Oracle SQL 创建或替换带有/不带有列名的视图

IOS UICollectionView 在使用两个集合视图时抛出断言