Oracle Query не возвращает все строки из обоих подзапросов - PullRequest
0 голосов
/ 26 марта 2019

У меня есть два подзапроса, которые по существу запрашивают одну и ту же вещь минус измерение (столбец флага). Затем я собираю данные из этих двух подзапросов и возвращаю их во «внешнем запросе». (Со значениями Orig и RE (VAL) в одной строке)

Составной ключ, к которому я присоединяюсь, состоит из следующих столбцов:

P_NAME, REAL_DATE, UTC_TIME, DATA_TYPE & LOCAL_TS

Некоторые образцы данных, возвращенные из первого подзапроса

P_NAME    REAL_DATE   UTC_TIME    DATA_TYPE   VAL   LOCAL_TS      FLAG
John      01-01-2018  01:00:00AM  Height      60    04:00:00AM    ORIG
Jacob     01-01-2018  02:00:00AM  Height      68    05:00:00AM    ORIG
Jingle    01-01-2018  01:00:00AM  Height      65    04:00:00AM    ORIG
Heimer    01-01-2018  04:00:00AM  Height      68    07:00:00AM    ORIG
Schmidt   01-01-2018  05:00:00AM  Height      72    08:00:00AM    ORIG

Некоторые образцы данных, возвращенные из второго подзапроса

P_NAME    REAL_DATE   UTC_TIME    DATA_TYPE   VAL   LOCAL_TS      FLAG
John      01-01-2018  01:00:00AM  Height      90    04:00:00AM    RE
Jacob     01-01-2018  02:00:00AM  Height      98    05:00:00AM    RE
Jingle    01-01-2018  01:00:00AM  Height      95    04:00:00AM    RE

То, что мне нужно, вернулось из первого и второго подзапросов JOINED

P_NAME    REAL_DATE   UTC_TIME    DATA_TYPE   O_VAL  RE_VAL    LOCAL_TS
John      01-01-2018  01:00:00AM  Height      60       90      04:00:00AM
Jacob     01-01-2018  02:00:00AM  Height      68       98      05:00:00AM
Jingle    01-01-2018  01:00:00AM  Height      65       95      04:00:00AM
Heimer    01-01-2018  04:00:00AM  Height      68      null     07:00:00AM
Schmidt   01-01-2018  05:00:00AM  Height      72      null     08:00:00AM

Что я пробовал, но не работает:

select O.O_P_NAME as P_NAME
     , O.O_REAL_DATE as REAL_DATE
     , O.O_UTC_TIME as UTC_TIME
     , O.O_DATA_TYPE as DATA_TYPE
     , CASE WHEN O.O_VAL = R.R_VAL
            THEN null
            ELSE R.R_VAL
             END     as RESUBMITTED_VAL
     , O.O_VAL       as ORIG_VAL
     , O.O_LOCAL_TS  as LOCAL_TS
    FROM(
        (SELECT P_NAME as O_P_NAME
              , REAL_DATE as O_REAL_DATE
              , UTC_TIME as O_UTC_TIME
              , DATA_TYPE as O_DATA_TYPE
              , VAL as O_VAL
              , LOCAL_TS as O_LOCAL_TS
              , FLAG as O_FLAG
           FROM TABLE
          WHERE FLAG = 'ORIG' 
        ) O
        JOIN
        (SELECT P_NAME as R_P_NAME
              , REAL_DATE as R_REAL_DATE
              , UTC_TIME as R_UTC_TIME
              , DATA_TYPE as R_DATA_TYPE
              , VAL as R_VAL
              , LOCAL_TS as R_LOCAL_TS
              , FLAG as R_FLAG
           FROM TABLE
          WHERE FLAG = 'RE' 
        ) R
        ON O.O_P_NAME = R.R_P_NAME
       AND O.O_REAL_DATE = R.R_REAL_DATE
       AND O.O_UTC_TIME = R.R_UTC_TIME
       AND O.O_DATA_TYPE = R.R_DATA_TYPE
       AND O.O_LOCAL_TS = R.R_LOCAL_TS
        );

1 Ответ

1 голос
/ 26 марта 2019

Вам не нужны два подзапроса для этого.Просто сделайте кейс для разделения полей.

SELECT P_NAME 
              , REAL_DATE 
              , UTC_TIME 
              , DATA_TYPE 
              , MAX(CASE WHEN FLAG='ORIG' THEN VAL END) as O_VAL
              , MAX(CASE WHEN FLAG='RE' THEN VAL END) as R_VAL
              , LOCAL_TS 
           FROM TABLE
GROUP BY P_NAME, REAL_DATE, UTC_TIME, DATA_TYPE, LOCAL_TS

Бонусный ответ: если вы действительно решили, что вам нужны подзапросы, используйте UNION вместо объединения, потому что вы не знаете, какая таблица будет иметь дополнительныезначения.

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