Oracle с оговоркой не работает? - PullRequest
2 голосов
/ 29 апреля 2009

Я пытаюсь использовать предложение WITH в запросе, но продолжаю получать сообщение

ORA-00942: таблица или представление не существует

Я попытался создать простой запрос в качестве примера:

С
тест AS
(
ВЫБЕРИТЕ COUNT (Customer_ID) ИЗ Customer
)
SELECT * FROM test;

Но даже это не работает, просто выдает сообщение:

ВЫБРАТЬ * ОТ теста; 2 3 4 5 6 SQL>
ВЫБРАТЬ * ОТ теста
* ОШИБКА в строке 1:
ORA-00942: таблица или представление не существует

Я никогда раньше не использовал предложение WITH, есть что-то простое, что я здесь упускаю? Я использую Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod Любой совет будет оценен. Спасибо.

Ответы [ 4 ]

5 голосов
/ 29 апреля 2009

Я полагаю, в вашем скрипте пустая строка между предложением WITH и SELECT:

SQL> WITH
  2  test AS
  3  (
  4  SELECT COUNT(Customer_ID) FROM Customer
  5  )
  6  
SQL> select * from test;
select * from test
              *
ERROR at line 1:
ORA-00942: table or view does not exist

Это согласуется с тем фактом, что вы получили сообщение об ошибке "line 1" и SQL "select * from test", когда этот SQL должен быть в "line 6".

2 голосов
/ 29 апреля 2009

Ваш пример работает - только что попробовал (журнал SQL * Plus следует):

SQL> create table customer
  2  (customer_id number);
Table created.
SQL> with 
  2  test as 
  3  (select count(customer_id)
  4  from customer
  5  )
  6  select * from test;
COUNT(CUSTOMER_ID)
------------------
         0

Вы уверены, что у вас есть привилегии для таблицы клиентов или вам не нужен для нее квалификатор схемы (если она находится в другой схеме)?

0 голосов
/ 29 апреля 2009

Ошибка, которую вы получаете, буквально означает, что таблица для представления не существует в вашей текущей схеме и не имеет синонима, видимого для вашей схемы. Например, если я вхожу в систему как greg, а таблица находится в bob, то я должен ссылаться на таблицу как bob.test.

SELECT * FROM bob.test

Что касается синтаксиса WITH, я не знаком, но другие ответы покрывают этот штраф.

0 голосов
/ 29 апреля 2009

Взгляните на этот пример

EDIT

очень простой образец:

create table emp (emp_id number, dept_id number);
insert into emp values (1,20);
insert into emp values (2,20);
insert into emp values (3,20);
insert into emp values (4,30);

with
emp_counter  as (select count(distinct emp_id) from emp),
dept_counter as (select count(distinct dept_id) from emp)
select * from emp_counter, dept_counter;

COUNT(DISTINCTEMP_ID) COUNT(DISTINCTDEPT_ID)
--------------------- ----------------------
                    4                      2
...