运行多个子查询

Posted

技术标签:

【中文标题】运行多个子查询【英文标题】:Running multiple subqueries 【发布时间】:2014-05-06 19:27:48 【问题描述】:

我正在提取表 AbsDrgDiagnosis.Diagnosis 中的一个代码 (ICD9)。当 DMisNomenclatureMapCodes.CodeSetID = 'SNOMED_CT' 时,我需要提取另一个表 DMisNomenclatureMapCodes.CodeID 中的另一个代码(SNOMED_CT)

那么链接这两个表的唯一方法是在 DMisNomenclatureMapCodes.CodeSetID = 'ICD9' 时通过 AbsDrgDiagnosis.Diagnosis = DMisNomenclatureMapCodes.CodeID

例如,当 CodeSetID = 'SNOMED_CT' 时,我必须从 DMisNomenclatureMapCodes.CodeID 报告 3942005。

EXAMPLE DATA:
                                Diagnosis   
AbsDrgDiagnosis                 290.23  

                                CodeID         CodeSetID    MisNomenclatureMapID
DMisNomenclatureMapCodes        290.23         ICD9         IMO-PROC-99959
                                3942005        SNOMED_CT    IMO-PROC-99959
                                53899          CPT          IMO-PROC-99959

到目前为止,我只能比较 DMisNomenclatureMapCodes.CodeID 上的 AbsDrgDiagnosis.Diagnosis,它们都等于 290.23,但之后我不知道如何获得 SNOMED 代码。我假设我必须对 DMisNomenclatureMapCodes.MisNomenclatureMapID 执行另一个子查询以获取分组,然后找到 SNOMED_CT 的 CodeSetID 以获取 CodeID 3942005 的最终值。 我该如何尝试?任何帮助将不胜感激,我尝试了几个子查询,但他们出错了。我是 SQL 新手,所以如果我说的不正确或以专家的方式写出来,请善待。

CODE:
DECLARE
    SET @StartDate = '10/28/2013 00:00:000'
    SET @EndDate = '12/28/2013 23:59:000'

SELECT 
    ,Diagnosis AS Code_3
    ,DMisNomenclatureMapCodes.CodeID
    ,DMisNomenclatureMapCodes.MisNomenclatureMapID

FROM AbsDrgDiagnoses

    LEFT JOIN AbstractData
    ON AbstractData.VisitID = AbsDrgDiagnoses.VisitID
    LEFT JOIN DMisNomenclatureMapCodes
    ON DMisNomenclatureMapCodes.CodeID = AbsDrgDiagnoses.Diagnosis

WHERE AbstractData.DischargeDateTime BETWEEN @StartDate and @EndDate

【问题讨论】:

【参考方案1】:

鉴于此,“那么,当 DMisNomenclatureMapCodes.CodeSetID = 'ICD9' 时,通过 AbsDrgDiagnosis.Diagnosis = DMisNomenclatureMapCodes.CodeID 来链接这两个表的唯一方法是”,难道你不能改变这个吗:

LEFT JOIN DMisNomenclatureMapCodes
ON DMisNomenclatureMapCodes.CodeID = AbsDrgDiagnoses.Diagnosis

到这里:

LEFT JOIN DMisNomenclatureMapCodes
ON DMisNomenclatureMapCodes.CodeID = AbsDrgDiagnoses.Diagnosis
and DMisNomenclatureMapCodes.CodeSetID = 'ICD9'

?

【讨论】:

感谢丹的回复。如果我放置 CodeSetID = 'ICD9' 它将返回它现在返回的内容。当 AbsDrgDiagnoses.Diagnosis 有一个数字时,它总是 ICD9,当 AbsDrgDiagnoses.Diagnosis = DMisNomenclatureMapCodes.CodeID 时,它总是'ICD9'。 所以我认为必须完成的方法是找到 AbsDrgDiagnoses.Diagnosis = DMisNomenclatureMapCodes.CodeID 之间的匹配项,然后根据 DMisNomenclatureMapCodes.MisNomenclatureMapID 字段进行一些搜索,然后获取 SNOMED_CT 代码。至少我是这么想的,但我愿意接受任何建议。 :)【参考方案2】:

感谢任何回复此问题的人。事实证明,我必须构建几个子查询才能实现我想要的。当两个 ICD9 代码都通过

出现时,最底部的子查询返回命名图结果
NMC.CodeID = AbsDrgDiagnoses.Diagnosis. 

现在这是我的问题,我不知道当它从另一个子查询返回单个结果时,您可以在子查询中包含 AND 语句,学到了一些新东西!因此我只能返回 'SNOMED_CT' 的 CodeSetID,而不是 5510009 的实际 CodeID。通过输入

WHERE NMC.CodeSetID = 'SNOMED_CT' AND NMC.MisNomenclatureMapID IN

然后我能够返回所需的值。

代码:

,COALESCE((SELECT NMC.CodeID
    FROM DMisNomenclatureMapCodes NMC   
    WHERE NMC.CodeSetID = 'SNOMED_CT'  AND NMC.MisNomenclatureMapID IN
    (SELECT NMC.MisNomenclatureMapID 
        FROM DMisNomenclatureMapCodes NMC   
        WHERE (NMC.CodeID = AbsDrgDiagnoses.Diagnosis)
    ) 
),'') AS SNOSet_TEST

【讨论】:

技术上我不能只做一个 NMC.CodeID = AbsDrgDiagnoses.Diagnosis 的连接,然后对连接做一个子查询吗?

以上是关于运行多个子查询的主要内容,如果未能解决你的问题,请参考以下文章

为来自不同表的两个单独操作运行多个子查询(相关)并加入一个表[关闭]

CTE内部有多个子查询

带有多个子查询的 SQL 错误 10249 Hive

使用子查询更新语句

ORA-01427:单行子查询返回多个行

如何使用具有多个 GROUP BY、子查询和 WHERE IN 在大表上的查询来优化查询?