ORA-01427: однострочный подзапрос возвращает более одной строки при отображении вывода - PullRequest
0 голосов
/ 29 апреля 2019

Я хочу отобразить 3 вывода с некоторыми условиями для этого конкретного вывода, но не для всего запроса. поэтому я использовал подзапрос в операторе выбора.

Я пробовал ниже код

--CREATE TABLE i86813_dt190429 as 
                   SELECT 
                   /*+ use_hash(RAP01 RAA02 RAP06) */ 
                   DISTINCT 'I86813' AS audit_id,
                   rap01.plcy                 AS plcy,
                   rap01.stuscd,
                   raa02.enddt_t              AS enddt,
                   rap01.j01_pt_line_cat_cd   AS j01_pt_line_cat_cd,
                   rap01.j01_pt_cdb_part_id   AS j01_pt_cdb_part_id,
                   rap01.j01_pt_state_cd      AS j01_pt_state_cd,
                   rap06.sctype,
                   raa02.EACPRC,

                   (SELECT rap06.pstsc
                     FROM rap06
                     JOIN raa02
                   ON rap06.plcy = raa02.plcy
                      AND raa02.enddt_t - 1 BETWEEN rap06.enddt_t AND ( rap06.dropdt_t - 1 )
                   ) AS pstsc_before_ea  --one day before EA
                   ,
                   (
                   SELECT rap01.aap
                     FROM rap01
                     JOIN raa02
                   ON rap01.plcy = raa02.plcy
                      AND raa02.enddt_t - 1 = rap01.enddt_t
                   ) AS aap_before_ea        --one day before EA and after EA
                   ,
                   (
                   SELECT rap01.aap
                     FROM rap01
                     JOIN raa02
                   ON rap01.plcy = raa02.plcy
                      AND raa02.enddt_t > rap01.enddt_t
                   ) AS aap_after_ea
--
from RAP01
--
Join RAA02 
ON raa02.j46_pt_line_cat_cd    = rap01.j01_pt_line_cat_cd
AND raa02.j46_pt_cdb_part_id   = rap01.j01_pt_cdb_part_id
AND raa02.j46_pt_state_cd      = rap01.j01_pt_state_cd
AND raa02.plcy                 = rap01.plcy
AND raa02.EACPRC               = '25'                    --channel of processing.
AND raa02.ahevnt               = '0993'                  -- ??
and raa02.sprodt_t             BETWEEN '13-AUG-2018' and '14-APR-2019'
--
left JOIN RAP06
ON RAP06.J42_PT_LINE_CAT_CD    = RAP01.J01_PT_LINE_CAT_CD
AND RAP06.J42_PT_CDB_PART_ID   = RAP01.J01_PT_CDB_PART_ID
AND RAP06.J42_PT_STATE_CD      = RAP01.J01_PT_STATE_CD
AND RAP06.PLCY                 = RAP01.PLCY
AND RAP06.SCTYPE               = '085'
AND RAA02.enddt_t              BETWEEN RAP06.ENDDT_T AND  (RAP06.DROPDT_T  - 1)     
--
WHERE rap01.j01_pt_line_cat_cd = 'A'
AND rap01.co3 || rap01.line3 IN (
'065010',
'010010',
'027010',
'021010',
'386010',
'065019',
'010019',
'027019',
'021019',
'386019'
)
AND RAP06.PLCY is NULL;

Я получил сообщение об ошибке: «ORA-01427: однострочный подзапрос возвращает более одной строки» и '01427. 00000 - «однострочный подзапрос возвращает более одной строки» '

Не могли бы вы предложить решение.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

В вашем операторе select у вас есть 3 подзапроса для заполнения столбцов pstsc_before_ea, aap_before_ea и aap_after_ea:

.....
                   (SELECT rap06.pstsc
                     FROM rap06
                     JOIN raa02
                   ON rap06.plcy = raa02.plcy
                      AND raa02.enddt_t - 1 BETWEEN rap06.enddt_t AND ( rap06.dropdt_t - 1 )
                   ) AS pstsc_before_ea  --one day before EA
                   ,
                   (
                   SELECT rap01.aap
                     FROM rap01
                     JOIN raa02
                   ON rap01.plcy = raa02.plcy
                      AND raa02.enddt_t - 1 = rap01.enddt_t
                   ) AS aap_before_ea        --one day before EA and after EA
                   ,
                   (
                   SELECT rap01.aap
                     FROM rap01
                     JOIN raa02
                   ON rap01.plcy = raa02.plcy
                      AND raa02.enddt_t > rap01.enddt_t
                   ) AS aap_after_ea

каждый из них должен возвращать только 1 строку .
Но похоже, что по крайней мере 1 из них возвращается больше.
Вы можете избежать ошибки, используя что-то вроде:

SELECT max(rap01.aap)...

если это соответствует вашей логике.

0 голосов
/ 29 апреля 2019

Если вы используете подзапрос в main select, то он должен возвращать одно значение. Похоже, вы проходите фильтр диапазона дат, который перенастраивает несколько строк.

AND raa02.enddt_t - 1 BETWEEN rap06.enddt_t AND ( rap06.dropdt_t - 1 )

Вы можете присоединить эти подзапросы как производную таблицу к базовой таблице.

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