首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从主查询中排除子查询结果

从主查询中排除子查询结果
EN

Stack Overflow用户
提问于 2017-07-12 19:58:37
回答 2查看 2K关注 0票数 0

我的主查询(COPD)中有一组病人,在我的子查询(CANC)中有另一组患者。我想将CANC _ID排除在主查询结果之外,但这似乎不起作用,而且运行时间太长。是否有更好的方法来排除子查询结果?我试着不存在也不存在,但我认为我做得不对,因为本应被排除在外的病人仍在出现。

代码语言:javascript
运行
复制
SELECT DISTINCT 
        pe.PAT_ENC_CSN_ID,
        pe.PAT_ID,
        pe.CONTACT_DATE,
        vp.PAT_MRN_ID,
        vp.PAT_NAME,
        vp.SEX_NAME,
        pat.BIRTH_DATE,
        vp.AGE_YEARS,
        vp.CUR_PCP_NAME
FROM PAT_ENC pe
    INNER JOIN V_PAT_FACT vp on pe.PAT_ID=vp.PAT_ID
    INNER JOIN PATIENT pat on vp.PAT_ID=pat.PAT_ID
    INNER JOIN CLARITY_ADT adt on pe.PAT_ENC_CSN_ID=adt.PAT_ENC_CSN_ID
    LEFT OUTER JOIN PAT_ENC_DX dx on pe.PAT_ID=dx.PAT_ID
    LEFT OUTER JOIN CLARITY_EDG edg on dx.DX_ID=edg.DX_ID
    INNER JOIN GROUPER_COMPILED_RECORDS gcr on edg.DX_ID=gcr.COMPILED_REC_LIST_VALUE

------- EXCLUSION CANCER
LEFT JOIN
    (
SELECT DISTINCT pl.PAT_ID
    FROM PROBLEM_LIST pl
        LEFT OUTER JOIN CLARITY_EDG edg on pl.DX_ID=edg.DX_ID
        INNER JOIN GROUPER_COMPILED_RECORDS rec on edg.DX_ID=rec.COMPILED_REC_LIST_VALUE
    WHERE rec.GROUPER_ID in ('2100000011')
    )cx on pe.PAT_ID=cx.PAT_ID

WHERE pe.CONTACT_DATE > '2016-07-01 00:00:00.000' 
    AND pe.WEIGHT>= '1587.3'  -- 45 kg or more
    AND vp.AGE_YEARS BETWEEN '40' AND '80'  
    AND vp.SEX_C in ('1','2') --FEMALE or MALE
    AND adt.PAT_CLASS_C in ('101','103','104')  ---IP, OBS or ED
    AND vp.IS_VALID_PAT_YN = 'Y'  -- NOT TEST
    AND pat.PAT_STATUS_C <>'2' --NOT DECEASED
    AND cx.PAT_ID IS NULL
EN

回答 2

Stack Overflow用户

发布于 2017-07-12 23:11:03

连接条件

你的加入条件没有意义。具体地说:

代码语言:javascript
运行
复制
FROM PROBLEM_LIST pl
        LEFT OUTER JOIN CLARITY_EDG edg on pl.DX_ID=edg.DX_ID
        INNER JOIN GROUPER_COMPILED_RECORDS rec on edg.DX_ID=rec.COMPILED_REC_LIST_VALUE

在上面的LEFT JOINCLARITY_EDG表中,然后从INNER JOINGROUPER_COMPILED_RECORDSINNER JOIN要求记录同时存在于左表和右表中,因此将先前的LEFT JOIN转换为INNER JOIN

假设您需要连接中的所有表,则需要将LEFT JOIN转换为INNER JOIN

主查询也需要修改。

更新(感谢@ThorstenKettner指出了问题):我删除了我的示例查询,因为它没有意义。

查询性能

DISTINCT --对性能产生负面影响,因为Server必须对结果集进行自动连接,以检查副本。检查结果看看你是否真的需要它。如果您确实获得了副本,那么找到生成它们的JOIN并添加更多的联接条件。

WHERE -指定常量时不匹配的数据类型,例如,如果AGE_YEARS列是INT,请确保BETWEEN条件指定INTBETWEEN 40 AND 80。如果数据类型不相同,则强制SQL server进行类型转换,在上述情况下,它将将整个表列转换为string (而不是常量到int)来计算条件。对于大型表,它不会很快,也会阻止Server在本列中使用索引(如果有创建的话)。

票数 1
EN

Stack Overflow用户

发布于 2017-07-12 23:18:53

由于我没有数据可以检查,所以我不认为您的左联接(排除连接)是正确的,尽管在它之后有一个左连接然后是一个内部连接,所以我将它更改为一个左连接。

代码语言:javascript
运行
复制
   SELECT DISTINCT 
            pe.PAT_ENC_CSN_ID,
            pe.PAT_ID,
            pe.CONTACT_DATE,
            vp.PAT_MRN_ID,
            vp.PAT_NAME,
            vp.SEX_NAME,
            pat.BIRTH_DATE,
            vp.AGE_YEARS,
            vp.CUR_PCP_NAME
    FROM PAT_ENC pe
        INNER JOIN V_PAT_FACT vp on pe.PAT_ID=vp.PAT_ID
        INNER JOIN PATIENT pat on vp.PAT_ID=pat.PAT_ID
        INNER JOIN CLARITY_ADT adt on pe.PAT_ENC_CSN_ID=adt.PAT_ENC_CSN_ID
        LEFT OUTER JOIN PAT_ENC_DX dx on pe.PAT_ID=dx.PAT_ID
        LEFT OUTER JOIN CLARITY_EDG edg on dx.DX_ID=edg.DX_ID
        INNER JOIN GROUPER_COMPILED_RECORDS gcr on edg.DX_ID=gcr.COMPILED_REC_LIST_VALUE

    WHERE pe.CONTACT_DATE > '2016-07-01 00:00:00.000' 
        AND pe.WEIGHT>= '1587.3'  -- 45 kg or more
        AND vp.AGE_YEARS BETWEEN '40' AND '80'  
        AND vp.SEX_C in ('1','2') --FEMALE or MALE
        AND adt.PAT_CLASS_C in ('101','103','104')  ---IP, OBS or ED
        AND vp.IS_VALID_PAT_YN = 'Y'  -- NOT TEST
        AND pat.PAT_STATUS_C <>'2' --NOT DECEASED
        ------- EXCLUSION CANCER
        AND pe.PAT_ID not in 
                                (
                                SELECT  pl.PAT_ID
                                FROM PROBLEM_LIST pl
                                    LEFT OUTER JOIN CLARITY_EDG edg on pl.DX_ID=edg.DX_ID
                                    LEFT JOIN GROUPER_COMPILED_RECORDS rec on edg.DX_ID=rec.COMPILED_REC_LIST_VALUE 
                                              AND rec.GROUPER_ID in ('2100000011')
                                )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45066503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档