ORA-01446 - невозможно выбрать ROWID из вида с помощью DISTINCT, GROUP BY и т. Д. - PullRequest
4 голосов
/ 21 марта 2012

Я создал представление, которое отличается от предложения select.

Когда я пытаюсь выбрать все записи с помощью «select * from view», я получаю следующую ошибку:

ORA-01446: cannot select ROWID from view with DISTINCT, GROUP BY, etc.

Я искал, почему это происходит, и пришел к этому:

Вы попытались создать представление, включающее ROWID в оператор SELECT, а также такое предложение, как DISTINCT или GROUP BY. Это не разрешено 1010 * Reference *

Это неудобно, поскольку выбранная позиция в представлении не выбирает идентификатор строки и не используется ни в одном другом пункте (где, порядок и т. Д.)

Есть идеи по этому поводу?

Обновление

Я не могу опубликовать запрос сам, но я публикую похожий запрос. Вот оно:

SELECT DISTINCT t1.c1 TABLE1_C1,
t1.c2 TABLE1_C2,
t1.c3 TABLE1_C3,
t1.c4 TABLE1_C4,
t1.c4 TABLE1_C4,
t1.c5 TABLE1_C5,
t1.c6 TABLE1_C6,
t1.c7 TABLE1_C7,
t1.c8 TABLE1_C8,
t2.c1 TABLE2_C1,
t2.c2 TABLE2_C2,
t2.c3 TABLE2_C3,
t2.c4 TABLE2_C4,
t2.c5 TABLE2_C5,
t3.c1 TABLE3_C1,
t2.c6 TABLE2_C6,
t4.c1 TABLE4_C1,
t4.c2 TABLE4_C2,
t4.c3 TABLE4_C3
  FROM table1 t1
  LEFT JOIN table2 t2
  ON t1.c1 = t2.c7
  left JOIN table4 t4
  ON t4.c4 = t2.c1
  LEFT JOIN table3 t3
  ON (t2.c1 = t3.c2
  AND t2.c8 = t3.c3
  AND t2.c9 = t3.c4)
  WHERE (t2.cp5  = 0 or t2.cp5 is null)
  AND (t2.c3  =
    (SELECT MAX(c3)
    FROM table2 s_t2
    WHERE s_t2.c3 LIKE t2.c3
    AND s_t2.c7 = t1.c1
    ) or t2.c3 is null)

Ответы [ 3 ]

1 голос
/ 06 марта 2017

Не уверен, что делал OP, так как в запросе нет ROWID.Но это может помочь - просто добавьте псевдоним столбца:

SQL>select  * from (select rowid from dual union select rowid from dual);
select  * from (select rowid  from dual union     select rowid from dual)
        *
ERROR at line 1:
ORA-01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY, etc.


SQL>select * from (select rowid as row_id from dual union select rowid from dual);

ROW_ID
------------------
AAAAB0AABAAAAOhAAA

1 row selected.
1 голос
/ 24 марта 2012

Если вы используете отдельные или сгруппированные по нескольким строкам, можете квалифицировать условие. Таким образом, разные исполнения будут возвращать разные идентификаторы строк и другой вопрос, если несколько строк укажут, какую вы бы вернули?

Это просто не имеет смысла

0 голосов
/ 14 сентября 2017

Другая возможность : только что пережил эту ошибку за последние 3 дня, у меня есть другая комбинация опций, которые могут вызвать это.

  1. ваш запрос использует стиль ANSIобъединения и
  2. одна или несколько задействованных таблиц являются материализованным представлением или таблицей с QUERY REWRITE предоставленной опцией

Вы можетеполучить сообщение об ошибке Oracle:

ORA-01445 : невозможно выбрать ROWID из или объединить представление без таблицы с сохранением ключа

Мы наконец обнаружили, что 2 изв таблицах большого запроса была установлена ​​эта опция, и она выдавала эту ошибку.Разрешение было предоставлено нашей схеме для этих двух таблиц.

Потребовалось много времени, чтобы определить причину, потому что: 1) таблицы принадлежат другой команде, и 2) таблицы предоставили QUERY REWRITEразрешение на нашу схему, но запрос (скомпилированный в повседневной работе) не прошел через 3 недели после обновления системы.

Команда, предоставившая это право, отозвала его, но проблема остается.Таким образом, наша краткосрочная альтернатива ежедневной работе состоит в том, чтобы добавить к действию следующее:

ALTER SESSION SET QUERY_REWRITE_ENABLED = FALSE;

Дополнительные вопросы, которые у нас есть:

  1. Мы все еще размышляем над тем, как заставить оптимизатор пересмотреть запрос, чтобы определить, что у нас больше нет этого гранта, но может потребоваться перезагрузка системы.

  2. ПокаЯ узнаю, что материализованное представление создает физическую таблицу, и я все еще спрашиваю себя, почему таблице , которая не является частью mview , было бы предоставлено это право.

...