2009-04-08 78 views
1

我試圖在Oracle數據庫中創建視圖,但不斷收到ORA-00907錯誤(缺少右括號)。我的SQL如下:Oracle在創建視圖時拋出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一起工作太久,所以我對它的怪癖一無所知。

回答

3

您需要刪除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將告訴你到底有用的語法錯誤發生 - 下面的代碼片斷顯示它反對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 
+0

+1,與sqlplus提示很好的接觸... – DCookie 2009-04-08 22:32:09

4
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

+0

+1,你的回答總是明確和點 – DCookie 2009-04-08 22:29:40

3

之間AS由於沒有你的括號是必要的,並且他們做閱讀的代碼更難,爲什麼不擺脫他們?

+0

這不是parenteses,這是很好的甲骨文語法解析器的方式來報告錯誤。 Oracle不能識別表名和別名之間的AS。 – Quassnoi 2009-04-08 17:02:39

2

其他人指出你的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'