Как решить эту ошибку идентификатора запроса SQL в псевдониме? - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь получить количество планов событий в таблице, но показываю ошибку идентификатора в счетчике псевдонима имени плана событий.

IN ORACLE DATABASE (SQL) Это моя таблица

SELECT
  EventRequest.eventNo,
  EventRequest.dateHeld,
  count(*) AS eventPlanCount 
FROM EventRequest,eventplan 
where EventRequest.eventNo = Eventplan.eventNo and
Eventplan.workDate BETWEEN '01-DEC-2018' AND '31-DEC-2018'
GROUP BY EventRequest.eventNo
HAVING eventPlanCount > 1;

Я получаю эту ошибку:

Error starting at line : 1 in command -
SELECT
  EventRequest.eventNo,
  EventRequest.dateHeld,
  count(*) AS eventPlanCount
FROM EventRequest 
  where EventRequest.eventNo = Eventplan.eventNo and
Eventplan.workDate BETWEEN '01-DEC-2018' AND '31-DEC-2018'
GROUP BY EventRequest.eventNo
HAVING eventPlanCount > 1
Error at Command Line : 9 Column : 8
Error report -
SQL Error: ORA-00904: "EVENTPLANCOUNT": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:

Я новичок в этом, пожалуйста, помогите мне! СПАСИБО ЗАРАНЕЕ !! ..

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Некоторые сведения о вашем запросе:

  • Вы должны использовать современный синтаксис соединения (SQL -92) вместо старых соединений. Они менее подвержены ошибкам, их легче читать, они более эффективны и их легче отлаживать. Исправлено в запросе.

  • Легче использовать псевдонимы таблиц. Это улучшает читаемость и упрощает отладку. Я определил r и p.

  • Столбцы, отсутствующие в предложении GROUP BY, должны быть агрегированы. Я добавил r.dateHeld в предложение GROUP BY.

  • Лучше убедиться, что вы используете правильное сравнение дат. Я заставил Oracle преобразовать строки в даты. Иногда Oracle [неправильно] нормализует все до VARCHAR2 s, если операнды другого типа.

  • В предложении HAVING я использовал count(*).

При этом ваш запрос может выглядеть так:

SELECT
  r.eventNo,
  r.dateHeld,
  count(*) AS eventPlanCount 
FROM EventRequest r
JOIN eventplan p ON r.eventNo = p.eventNo
WHERE p.workDate BETWEEN date '2018-12-01' AND date '2018-12-31'
GROUP BY r.eventNo, r.dateHeld
HAVING count(*) > 1
1 голос
/ 04 августа 2020

Здесь:

HAVING eventPlanCount > 1;

Вы не можете использовать здесь псевдоним. Вместо этого вам нужно повторить выражение:

HAVING COUNT(*) > 1

У вашего запроса есть другие проблемы, а именно:

  • столбец dateHeld должен быть либо повторен в group by или принадлежать к функции агрегирования в предложении select

  • вы бы предпочли использовать допустимые литералы даты, а не полагаться на неявное преобразование строк в дату (также наполовину открытые интервалы безопаснее, чем between)

  • вы должны использовать явные объединения вместо неявных объединений старой школы

Итак:

select r.eventno, r.dateheld, count(*) as eventplancount 
from eventrequest r
inner join eventplan p on p.eventno = r.eventno 
where p.workdate >= date '2018-01-01' and p.workdate < date '2019-01-01'
group by r.eventno, r.dateheld
having count(*) > 1;
...