首页 > 解决方案 > Oracle 中的子查询效率/错误

问题描述

如果返回正值,则尝试使用子查询返回值-但是,如果我尝试按 x 分组,则子查询会出错(单行子查询返回多行)

背景是我正在搜索自由文本注释以寻找“%home%”-如果任何地方有任何注释(与参数匹配),那么我希望将 1 作为每个患者遇到的最终值返回-

我希望这是有道理的。

我还将该部分简单地包括在更大的查询中作为左连接 -

left join  HNO_INFO on pat_enc_hsp.pat_enc_csn_id=HNO_INFO.pat_enc_csn_id
left join HNO_NOTE_TEXT  ON HNO_INFO.note_id = HNO_NOTE_TEXT.note_id and  LOWER(note_text) like '%home%' and IP_NOTE_TYPE_C in ('35','100003','4','161100013','161100003')

但是,这会导致多行,或者如果我使用内部连接,它将排除仍然必须包含的遭遇。如果需要,我可以通过使用 row_number() 函数来解决这个问题并相应地重新排序 - 但是在计算速度方面寻找更有效的方法

TIA

code-2nd 部分的一部分是问题-

select distinct CESR.PAT_MRN_ID,CESR.PREG_OUTCOME_DATE,HSP_LD_MOM_CHILD.pat_enc_csn_id,HSP_LD_MOM_CHILD.CHILD_ENC_CSN_ID,
pat_enc_hsp.HOSP_ADMSN_TIME,pat_enc_hsp.HOSP_DISCH_TIME,

(select sum(case when LOWER(note_text) like '%home%' then 1 else 0 end) from 
        pat_enc_hsp inner join HNO_INFO on pat_enc_hsp.pat_enc_csn_id=HNO_INFO.pat_enc_csn_id
inner join HNO_NOTE_TEXT  ON HNO_INFO.note_id = HNO_NOTE_TEXT.note_id and  LOWER(note_text) like '%home%' 
and IP_NOTE_TYPE_C in ('35','100003','4','161100013','161100003')
group by pat_enc_hsp.pat_enc_csn_id) as LD_NOTE

from  x.CESR_COHORT CESR inner join patient A on CESR.pat_mrn_id=a.pat_mrn_id
                        left join pat_enc_hsp on a.pat_id=pat_enc_hsp.pat_id and CESR.PREG_OUTCOME_DATE between trunc(pat_enc_hsp.HOSP_ADMSN_TIME) and trunc(pat_enc_hsp.HOSP_DISCH_TIME) 
                        left join HSP_LD_MOM_CHILD on pat_enc_hsp.pat_enc_csn_id=HSP_LD_MOM_CHILD.pat_enc_csn_id

标签: oraclesubquery

解决方案


哦-您的问题是您的子查询与您的主查询不相关-您pat_enc_hsp在其中有一个,但其中没有任何内容可以将其列与pat_enc_hsp您的主要外部查询中的列相匹配。因此,您的子查询正在查询每个人,而不仅仅是单个患者。如果您为每个表使用列别名,那将更加明显。

尝试删除它,而不是像这样:

SELECT DISTINCT
       CESR.PAT_MRN_ID,
       CESR.PREG_OUTCOME_DATE,
       HSP_LD_MOM_CHILD.pat_enc_csn_id,
       HSP_LD_MOM_CHILD.CHILD_ENC_CSN_ID,
       pat_enc_hsp.HOSP_ADMSN_TIME,
       pat_enc_hsp.HOSP_DISCH_TIME,
       (  SELECT SUM (
                     CASE
                         WHEN LOWER (note_text) LIKE '%home%' THEN 1
                         ELSE 0
                     END)
            FROM HNO_INFO -- no pat_enc_hsp in this subquery
                 INNER JOIN HNO_NOTE_TEXT
                     ON     HNO_INFO.note_id = HNO_NOTE_TEXT.note_id
                        AND LOWER (note_text) LIKE '%home%'
                        AND IP_NOTE_TYPE_C IN ('35',
                                               '100003',
                                               '4',
                                               '161100013',
                                               '161100003')
            WHERE pat_enc_hsp.pat_enc_csn_id = HNO_INFO.pat_enc_csn_id) -- references the outer query
           AS LD_NOTE
  FROM x.CESR_COHORT  CESR
       INNER JOIN patient A ON CESR.pat_mrn_id = a.pat_mrn_id
       LEFT JOIN pat_enc_hsp
           ON     a.pat_id = pat_enc_hsp.pat_id
              AND CESR.PREG_OUTCOME_DATE BETWEEN TRUNC (
                                                     pat_enc_hsp.HOSP_ADMSN_TIME)
                                             AND TRUNC (
                                                     pat_enc_hsp.HOSP_DISCH_TIME)
       LEFT JOIN HSP_LD_MOM_CHILD
           ON pat_enc_hsp.pat_enc_csn_id = HSP_LD_MOM_CHILD.pat_enc_csn_id

推荐阅读