Ошибка Oracle Throwing SQL при создании представления - PullRequest
1 голос
/ 08 апреля 2009

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

Ответы [ 4 ]

4 голосов
/ 08 апреля 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

3 голосов
/ 08 апреля 2009

Вам необходимо удалить 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
3 голосов
/ 08 апреля 2009

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

2 голосов
/ 08 апреля 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'
...