oracle - 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
解决方案
哦-您的问题是您的子查询与您的主查询不相关-您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
推荐阅读
- javascript - 如何使用 jQuery 对多个 HTML tbodies 进行分页
- vba - 禁用单选按钮后如何启用它?
- javascript - 将包含 5 个项目的数组转换为包含 1 个项目的数组
- spring-cloud - 在 Brave vs. Sleuth 中设置 Span 的跟踪 id
- angular - 带有 GET 请求的空结果
- activemq-artemis - Artemis 2.6.0 三节点集群
- python - 在 python 中动画 3D 绘图时遇到问题
- python - 使用 python sklearn 预测测试值的问题
- java - 创建倒数计时器
- google-compute-engine - 订阅 GCE 自动缩放组中的实例列表更新