Oracle выдает ошибку SQL при создании представления

Я пытаюсь создать представление в базе данных 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, поэтому мало что знаю о его причудах.


person Tom Elliott    schedule 08.04.2009    source источник


Ответы (4)


Вам нужно удалить AS в предложении FROM. 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
person Justin Cave    schedule 08.04.2009

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'
        )
)

Я удалил AS между data и attribute1

person Quassnoi    schedule 08.04.2009

Поскольку ни одна из ваших круглых скобок не нужна, и они усложняют чтение кода, почему бы не избавиться от них?

person tpdi    schedule 08.04.2009
comment
Это не круглые скобки, это хороший способ синтаксического анализатора Oracle сообщать об ошибках. Oracle не распознает AS между именем таблицы и псевдонимом. - person Quassnoi; 08.04.2009

Другие указали на ключевое слово AS в предложении FROM как на проблему. Я предлагаю следующее как более чистую и удобную для чтения версию того же утверждения:

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'
person JosephStyons    schedule 08.04.2009