Oracle Select Query, Order By + Limit Results - PullRequest
0 голосов
/ 29 августа 2011

Я новичок в Oracle и работаю с довольно большой базой данных.Я хотел бы выполнить запрос, который выберет нужные столбцы, упорядочит по определенному столбцу, а также ограничит результаты.Согласно всему, что я прочитал, приведенный ниже запрос должен работать, но он возвращает «ORA-00918: столбец неоднозначно определен»:

SELECT * FROM(SELECT * FROM EAI.EAI_EVENT_LOG e, 
     EAI.EAI_EVENT_LOG_MESSAGE e1 WHERE e.SOURCE_URL LIKE '%.XML' 
     ORDER BY e.REQUEST_DATE_TIME DESC) WHERE ROWNUM <= 20

Любые предложения будут приняты с благодарностью: D

Ответы [ 3 ]

6 голосов
/ 29 августа 2011

Сообщение об ошибке означает, что ваш результирующий набор содержит два столбца с одинаковым именем.Каждый столбец в проекции запроса должен иметь уникальное имя.Предположительно у вас есть столбец (или столбцы) с одинаковыми именами в EAI_EVENT_LOG и EAI_EVENT_LOG_MESSAGE.

Вы также хотите присоединиться к этому столбцу.В данный момент вы создаете перекрестное соединение между двумя таблицами.Другими словами, если у вас есть сто записей в EAI_EVENT_LOG и двести записей EAI_EVENT_LOG_MESSAGE, ваш набор результатов будет двадцать тысяч записей (без rownum).Это, вероятно, ваше намерение.


"При переключении на innerjoin это устранит ошибку с текущим кодом?"

Нет, вам все равно придется обрабатывать два столбцас тем же именем.В основном это происходит из-за использования SELECT * в двух таблицах.SELECT * плохая практика.Это удобно, но всегда лучше указывать нужные столбцы в проекции запроса.Таким образом, вы можете включить (скажем) e.TRANSACTION_ID и исключить e1.TRANSACTION_ID и избежать исключения ORA-00918.

2 голосов
/ 29 августа 2011

Может быть, у вас есть несколько столбцов в таблицах EAI_EVENT_LOG и EAI_EVENT_LOG_MESSAGE с одинаковыми именами? Вместо SELECT * перечислите все столбцы, которые вы хотите выбрать.

Другая проблема, которую я вижу, состоит в том, что вы выбираете из двух таблиц, но не объединяете их в предложении WHERE, поэтому результирующий набор будет перекрестным произведением этих двух таблиц.

1 голос
/ 29 августа 2011

Вам необходимо прекратить использовать синтаксис неявного соединения SQL '89.
Не потому что это не работает, а потому что это зло .
Прямо сейчас у вас есть cross join, что в 99,9% случаев не то, что вы хотите. Кроме того, каждый суб-выбор должен иметь свой собственный псевдоним.

SELECT * FROM
(SELECT e.*, e1.* FROM EAI.EAI_EVENT_LOG e
 INNER JOIN EAI.EAI_EVENT_LOG_MESSAGE e1 on (......)
 WHERE e.SOURCE_URL LIKE '%.XML' 
 ORDER BY e.REQUEST_DATE_TIME DESC) s WHERE ROWNUM <= 20

Укажите критерий соединения в пунктирной линии.

Обычно вы делаете соединение на ключевом поле, например ON (e.id = e1.event_id)

Плохо использовать select *, лучше точно указать, какие поля вы хотите:

SELECT e.field1 as customer_id
       ,e.field2 as customer_name
.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...