Oracle: ORA-00936: отсутствует выражение, пытается добавить оператор where в выбранный столбец - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть SQL-запрос, который прекрасно работает для получения информации за последние 2 года из нашей базы данных, возникает проблема, когда я пытаюсь добавить оператор, который добавляет новое условие в SQL.

where ASSIGNED_REP = 'PERSON, SOME',

Возможно, я делаю это неправильно, но один из столбцов, из которых я извлекаю информацию, настроен следующим образом:

name_full AS ASSIGNED_REP,

Поэтому я решил, что если я добавлю оператор where, он будет возвращать результаты только в том столбцесодержит имя пользователя, которое я дал.Однако я получаю сообщение об ошибке Oracle: ORA-00936: missing expression.

Мой SQL работает отлично, пока я не добавлю where ASSIGNED_REP = 'PERSON, SOME' к нему в 4-й строке.

Я новичок в SQL, поэтому уверен, что ячего-то не хватает.

Полный SQL:

select 
ccc.BID AS B_ID,
TTTT,
name_full AS ASSIGNED_REP where ASSIGNED_REP = 'PERSON, SOME', /* issue is here */
bbb.CUID,
bbb.BNN,
bbb.PGN,
ccc.TYP_CD AS CLM_TYP,
ccc.C_TYP AS SCLM_TYP,
C_DATE,
NEXT_DATE,
SUM(ccc.LINE) AS line_items,
SUM(ccc.AMT) AS c_amount,
SUM(ccc.CO_RSLVD) AS Z_RSLVD,
SUM(ccc.CU_RSLVD) AS C_RSVLD,
ccc.STATUS_TYP AS STATUS,
DATE_FOLLOW_UP,
bbb.STATE
from bstatus bbb
join display_view ccc on ccc.bnn = bbb.bn
left join user_profile up on uuu.zz_id = ccc.ASSIGNED_USER_ID
where ccc.C_DATE >= (sysdate - 730)
/* Also tried */
/* and ASSIGNED_REP = 'PERSON, SOME' */
group by ccc.BID,
TTTT,
uuu.name_full,
bbb.CUID,
bbb.BAN,
bbb.PGN,
ccc.TYP_CD,
ccc.C_TYP,
C_DATE,
NEXT_DATE,
ccc.STATUS_TYP,
DATE_FOLLOW_UP,
bbb.STATE

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Структура запроса довольно хорошо определена . Вы не можете иметь более одного where предложения 1 , и оно не принадлежит середине списка выбора.

Вы хотите добавить еще одно условие, поэтому добавьте его в существующее предложение where:

select 
ccc.BID AS B_ID,
TTTT,
uuu.name_full AS ASSIGNED_REP,
...
where ccc.C_DATE >= (sysdate - 730)
and uuu.name_full = 'PERSON, SOME'
group by ccc.BID,
...

Обратите внимание, что вы не можете использовать псевдоним ASSIGNED_REP в предложении where, вы должны использовать исходное имя столбца. Документация, на которую ссылаются выше, также включает (выделение добавлено):

c_alias

Укажите псевдоним для выражения столбца. Oracle Database будет использовать этот псевдоним в заголовке столбца набора результатов. Ключевое слово AS является необязательным. Псевдоним эффективно переименовывает элемент списка выбора на время запроса. Псевдоним может использоваться в order_by_clause , но не в других предложениях в запросе.

Так что вы можете order by ASSIGNED_REP, но вы не можете использовать его в предложении where или где-либо еще.


1 Я игнорирую подзапросы ...

0 голосов
/ 12 сентября 2018

Вы на правильном пути. Что вы хотите сделать здесь, это добавить к существующему предложению WHERE

SELECT ccc.BID AS B_ID
    ,TTTT
    ,ASSIGNED_REP
    ,bbb.CUID
    ,bbb.BNN
    ,bbb.PGN
    ,ccc.TYP_CD AS CLM_TYP
    ,ccc.C_TYP AS SCLM_TYP
    ,C_DATE
    ,NEXT_DATE
    ,SUM(ccc.LINE) AS line_items
    ,SUM(ccc.AMT) AS c_amount
    ,SUM(ccc.CO_RSLVD) AS Z_RSLVD
    ,SUM(ccc.CU_RSLVD) AS C_RSVLD
    ,ccc.STATUS_TYP AS STATUS
    ,DATE_FOLLOW_UP
    ,bbb.STATE
FROM bstatus bbb
    JOIN display_view ccc ON ccc.bnn = bbb.bn
    LEFT JOIN user_profile up ON uuu.zz_id = ccc.ASSIGNED_USER_ID
WHERE ccc.C_DATE >= (sysdate - 730)
    AND name_full = 'PERSON, SOME'
GROUP BY ccc.BID
    ,TTTT
    ,uuu.name_full
    ,bbb.CUID
    ,bbb.BAN
    ,bbb.PGN
    ,ccc.TYP_CD
    ,ccc.C_TYP
    ,C_DATE
    ,NEXT_DATE
    ,ccc.STATUS_TYP
    ,DATE_FOLLOW_UP
    ,bbb.STATE

Теперь вы будете получать билеты только за последние два года для человека по имени PERSON, SOME

...