ORA-01722: неверный номер выбрасывает в подзапрос

У меня есть запрос согласно следующему:

SELECT 
  WAH.ALERT_KEY AS ALERT_KEY, 
  TRUNC(WAH.EVENT_DATE) AS ALERT_DATE, 
  WAH.AT_DATASOURCE_ID AS DATA_SOURCE_ID, 
  WAH.CHECK_DEFINITION_ID AS CHECK_ID, 
  OU.ID AS ORGUNIT_ID, 
  USR.ID AS USER_ID, 
  GRP.ID AS GROUP_ID, 
  CUS.SOURCE_SYSTEM AS SOURCE_SYTEM 
FROM 
  WLM_ALERT_HEADER WAH, 
  CHECK_DEFINITION CD, 
  ORGANIZATION_UNITS OU, 
  USERS USR, 
  GROUPS GRP, 
  CUSTOMERS CUS, 
  WORKFLOW_WORKITEM WW 
WHERE 
  WAH.ALERT_KEY in (
    select 
      ENTITY_KEY 
    from 
      WORKFLOW_WORKITEM ww 
    where 
      ww.STATUS_ID in (
        select 
          ID 
        from 
          WORKFLOW_STATUSES ws 
        where 
          ws.CODE IN (
            'S_GE_WLM_WL_001', 'S_GE_WLM_WL_002', 
            'S_GE_WLM_WL_003', 'S_GE_WLM_WL_004', 
            'S_GE_WLM_WL_007', 'S_GE_WLM_WL_010'
          ) 
          and ww.ORGUNIT_ID in (
            select 
              ou.ID 
            from 
              ORGANIZATION_UNITS ou 
            where 
              ou.ID = (
                select 
                  cus.ORGUNIT_ID 
                from 
                  CUSTOMERS cus 
                where 
                  cus.CUSTOMER_ID = wah.CUSTOMER_ID
              )
          )
      ) 
  ) 
  AND WAH.CHECK_DEFINITION_ID = CD.ID 
  AND USR.ID = WW.ASSIGNED_TO 

  AND GRP.ID IN (
    select 
      GROUP_ID 
    from 
      USER_GROUP_RELATIONS 
    where 
      USER_ID = USR.ID
  ) 
  AND WW.ENTITY_NAME = 'WLM Alert';

ORA-01722 выбрасывается для вышеупомянутого запроса, если я не поставлю эти 2 строки:

AND WAH.CHECK_DEFINITION_ID = CD.ID 
AND USR.ID = WW.ASSIGNED_TO

внутри правой скобки подзапроса WAH.ALERT_KEY в

Однако это не должно быть так, поскольку эти 2 строки не являются частью подзапроса. Интересно, какое поле в подзапросе жалуется на сбой преобразования.

1 ответ

Решение

Ну, сообщение об ошибке относится к одному из ваших "подзапросов", все из которых были использованы для "объединения" таблиц

WHERE wah.ALERT_KEY IN ( SELECT ENTITY_KEY FROM WORKFLOW_WORKITEM ww
WHERE ww.STATUS_ID IN ( SELECT ID FROM WORKFLOW_STATUSES ws
AND ww.ORGUNIT_ID IN ( SELECT ou.ID FROM ORGANIZATION_UNITS ou
AND grp.ID IN ( SELECT GROUP_ID FROM USER_GROUP_RELATIONS

Одно из этих сравнений включает преобразование строки в число

До предложения where нет подзапросов:

SELECT
      wah.ALERT_KEY           AS alert_key
    , TRUNC(wah.EVENT_DATE)   AS alert_date
    , wah.AT_DATASOURCE_ID    AS data_source_id
    , wah.CHECK_DEFINITION_ID AS check_id
    , ou.ID                   AS orgunit_id
    , usr.ID                  AS user_id
    , grp.ID                  AS group_id
    , cus.SOURCE_SYSTEM       AS source_sytem
FROM WLM_ALERT_HEADER wah
   , CHECK_DEFINITION cd
   , ORGANIZATION_UNITS ou
   , USERS usr
   , GROUPS grp
   , CUSTOMERS cus
   , WORKFLOW_WORKITEM ww

Однако существует острая необходимость использовать "явные объединения" вместо этих запятых.

Другие вопросы по тегам