Как исправить ошибку, при которой строка с нулевым значением не возвращается в Oracle 11.2.0.1 - PullRequest
0 голосов
/ 16 октября 2019

Не возвращает пустые строки в Oracle 11.2.0.1.

Мой запрос

select
  a."EMP_NO", a."DEPT_WING", a."TAKEN_PLACE_ID", a."TAKEN_PLACE_CODE",
  a."REQ_PLACE_ID", a."REQ_PLACE_CODE", a."TIFFEN_DATE", a."TIFFIN_REQ_DATE",
  a."TDATE", a."TIFFIN_MONTH", a."TIFFEN_TYPE", a."TIFFIN_ID",
  --(select EMPLOYEE_COST from TIFFEN_MASTER where TIFFIN_ID=a.TIFFIN_ID) as t,
  UPPER(NVL(APP,SWP))AS TIFFIN_SLOT
from
  (select
     nvl(v1.emp_no,v2.emp_no) emp_no, NVL(V1.DEPTWING,V2.DEPTWING)DEPT_WING,
     V1.PLACE_ID TAKEN_PLACE_ID, V1.PLACE_CODE TAKEN_PLACE_CODE,
     V2.PLACE_ID REQ_PLACE_ID, V2.PLACE_CODE REQ_PLACE_CODE, v1.tiffen_date,
     v2.tiffin_req_date, nvl(v1.tiffen_date,v2.tiffin_req_date) TDate,
     to_number(to_char(tiffin_req_date,'yyyymm'))tiffin_month,
     (case
       when trunc(tiffen_date) = trunc(tiffin_req_date) and V1.TIFFIN_SLOT=V2.TIFFIN_SLOT then 1
       when (((trunc(tiffin_REQ_DATE) <= trunc(sysdate-1)) or (trunc(tiffen_date) <= trunc(sysdate-1))) and (tiffin_id=8) and V1.TIFFIN_SLOT <> V2.TIFFIN_SLOT) then 2
       when (((trunc(tiffin_REQ_DATE) <= trunc(sysdate-1)) or (trunc(tiffen_date) <= trunc(sysdate-1))) and (tiffin_id is not null)and V1.TIFFIN_SLOT=V2.TIFFIN_SLOT) then 1
       when (((trunc(tiffin_REQ_DATE) <= trunc(sysdate-1)) or (trunc(tiffen_date) <= trunc(sysdate-1))) and (tiffin_id=7) or V1.TIFFIN_SLOT <> V2.TIFFIN_SLOT) then 1
       when ((trunc(tiffin_REQ_DATE) <= trunc(sysdate-1)) or (trunc(tiffen_date) <= trunc(sysdate-1)) and V1.TIFFIN_SLOT <> V2.TIFFIN_SLOT) then 2
       else 0
     end ) Tiffen_type, tiffin_id, V2.TIFFIN_SLOT APP, V1.TIFFIN_SLOT AS SWP
   from
     (select
        emp_no, trunc(tiffin_req_date) tiffin_req_date,
        NVL(L.PLACE_ID,1) PLACE_ID, PLACE_CODE, E.DEPTWING, TIFFIN_SLOT
      from
        Tiffin_Applied L, LUNCH_PLACES P, V_EMP_DETAILS E
      WHERE
        EMP_NO=ID_NO AND
        P.place_id = NVL(L.PLACE_ID,1)
      ORDER BY 2) v2
     FULL OUTER JOIN (select emp_no,trunc(tiffen_date) tiffen_date,1 PLACE_ID,PLACE_CODE,E.DEPTWING,l.tiffin_id,TIFFIN_SLOT from Tiffen L,LUNCH_PLACES P,V_EMP_DETAILS E WHERE EMP_NO=ID_NO and (actinact=1 or actinact is null) AND P.PLACE_ID = NVL(1,1)) v1 ON
       v2.EMP_NO=v1.EMP_NO AND
       v2.TIFFIN_SLOT=v1.TIFFIN_SLOT AND
       v2.TIFFIN_REQ_DATE=v1.TIFFEN_DATE
   order by nvl(tiffen_date,tiffin_req_date)) a
WHERE
  EMP_NO ='17RD021';

please find the query result in the image. Row number 5 has some null values tiffin_place_codem tiffin_date

Если мы раскомментируем 4-йСтрока в запросе, затем 5-я строка, не входящая в Query, приводит к oracle 10.2.0.1. Почему? Пожалуйста, помогите мне. Но в оракуле 10.2.0.3 и даже в 4-й строке мы получим 4-ю строку в результате.

1 Ответ

0 голосов
/ 16 октября 2019

Вы можете достичь желаемого результата в обеих версиях, используя left join.

SELECT
    A."EMP_NO",
    A."DEPT_WING",
    A."TAKEN_PLACE_ID",
    A."TAKEN_PLACE_CODE",
    A."REQ_PLACE_ID",
    A."REQ_PLACE_CODE",
    A."TIFFEN_DATE",
    A."TIFFIN_REQ_DATE",
    A."TDATE",
    A."TIFFIN_MONTH",
    A."TIFFEN_TYPE",
    A."TIFFIN_ID",
    TM.EMPLOYEE_COST   AS T, -- changed this
    UPPER(NVL(APP, SWP)) AS TIFFIN_SLOT
FROM
    (
        SELECT
            NVL(V1.EMP_NO, V2.EMP_NO) EMP_NO,
            NVL(V1.DEPTWING, V2.DEPTWING) DEPT_WING,
            V1.PLACE_ID      TAKEN_PLACE_ID,
            V1.PLACE_CODE    TAKEN_PLACE_CODE,
            V2.PLACE_ID      REQ_PLACE_ID,
            V2.PLACE_CODE    REQ_PLACE_CODE,
            V1.TIFFEN_DATE,
            V2.TIFFIN_REQ_DATE,
            NVL(V1.TIFFEN_DATE, V2.TIFFIN_REQ_DATE) TDATE,
            TO_NUMBER(TO_CHAR(TIFFIN_REQ_DATE, 'yyyymm')) TIFFIN_MONTH,
            ( CASE
                WHEN TRUNC(TIFFEN_DATE) = TRUNC(TIFFIN_REQ_DATE)
                     AND V1.TIFFIN_SLOT = V2.TIFFIN_SLOT THEN 1
                WHEN ( ( ( TRUNC(TIFFIN_REQ_DATE) <= TRUNC(SYSDATE - 1) )
                         OR ( TRUNC(TIFFEN_DATE) <= TRUNC(SYSDATE - 1) ) )
                       AND ( TIFFIN_ID = 8 )
                       AND V1.TIFFIN_SLOT <> V2.TIFFIN_SLOT ) THEN 2
                WHEN ( ( ( TRUNC(TIFFIN_REQ_DATE) <= TRUNC(SYSDATE - 1) )
                         OR ( TRUNC(TIFFEN_DATE) <= TRUNC(SYSDATE - 1) ) )
                       AND ( TIFFIN_ID IS NOT NULL )
                       AND V1.TIFFIN_SLOT = V2.TIFFIN_SLOT ) THEN 1
                WHEN ( ( ( TRUNC(TIFFIN_REQ_DATE) <= TRUNC(SYSDATE - 1) )
                         OR ( TRUNC(TIFFEN_DATE) <= TRUNC(SYSDATE - 1) ) )
                       AND ( TIFFIN_ID = 7 )
                       OR V1.TIFFIN_SLOT <> V2.TIFFIN_SLOT ) THEN 1
                WHEN ( ( TRUNC(TIFFIN_REQ_DATE) <= TRUNC(SYSDATE - 1) )
                       OR ( TRUNC(TIFFEN_DATE) <= TRUNC(SYSDATE - 1) )
                       AND V1.TIFFIN_SLOT <> V2.TIFFIN_SLOT ) THEN 2
                ELSE 0
            END ) TIFFEN_TYPE,
            TIFFIN_ID,
            V2.TIFFIN_SLOT   APP,
            V1.TIFFIN_SLOT   AS SWP
        FROM
            (
                SELECT
                    EMP_NO,
                    TRUNC(TIFFIN_REQ_DATE) TIFFIN_REQ_DATE,
                    NVL(L.PLACE_ID, 1) PLACE_ID,
                    PLACE_CODE,
                    E.DEPTWING,
                    TIFFIN_SLOT
                FROM
                    TIFFIN_APPLIED L,
                    LUNCH_PLACES P,
                    V_EMP_DETAILS E
                WHERE
                    EMP_NO = ID_NO
                    AND P.PLACE_ID = NVL(L.PLACE_ID, 1)
                ORDER BY
                    2
            ) V2
            FULL OUTER JOIN (
                SELECT
                    EMP_NO,
                    TRUNC(TIFFEN_DATE) TIFFEN_DATE,
                    1 PLACE_ID,
                    PLACE_CODE,
                    E.DEPTWING,
                    L.TIFFIN_ID,
                    TIFFIN_SLOT
                FROM
                    TIFFEN L,
                    LUNCH_PLACES P,
                    V_EMP_DETAILS E
                WHERE
                    EMP_NO = ID_NO
                    AND ( ACTINACT = 1
                          OR ACTINACT IS NULL )
                    AND P.PLACE_ID = NVL(1, 1)
            ) V1 ON V2.EMP_NO = V1.EMP_NO
                    AND V2.TIFFIN_SLOT = V1.TIFFIN_SLOT
                    AND V2.TIFFIN_REQ_DATE = V1.TIFFEN_DATE
        ORDER BY
            NVL(TIFFEN_DATE, TIFFIN_REQ_DATE)
    ) A
    LEFT JOIN TIFFEN_MASTER TM ON ( TM.TIFFEN_ID = A.TIFFIN_ID ) -- added this join 
    -- Please correct the names of the column according to your table's column name
WHERE
    EMP_NO = '17RD021';

Я думаю, что название столбцов не является правильным. Пожалуйста, используйте правильные имена, и вы готовы идти.

Ура !!

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