我的主查询(COPD)中有一组病人,在我的子查询(CANC)中有另一组患者。我想将CANC _ID排除在主查询结果之外,但这似乎不起作用,而且运行时间太长。是否有更好的方法来排除子查询结果?我试着不存在也不存在,但我认为我做得不对,因为本应被排除在外的病人仍在出现。
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发布于 2017-07-12 23:11:03
连接条件
你的加入条件没有意义。具体地说:
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 JOIN到CLARITY_EDG表中,然后从INNER JOIN到GROUPER_COMPILED_RECORDS。INNER JOIN要求记录同时存在于左表和右表中,因此将先前的LEFT JOIN转换为INNER JOIN。
假设您需要连接中的所有表,则需要将LEFT JOIN转换为INNER JOIN。
主查询也需要修改。
更新(感谢@ThorstenKettner指出了问题):我删除了我的示例查询,因为它没有意义。
查询性能
DISTINCT --对性能产生负面影响,因为Server必须对结果集进行自动连接,以检查副本。检查结果看看你是否真的需要它。如果您确实获得了副本,那么找到生成它们的JOIN并添加更多的联接条件。
WHERE -指定常量时不匹配的数据类型,例如,如果AGE_YEARS列是INT,请确保BETWEEN条件指定INT和BETWEEN 40 AND 80。如果数据类型不相同,则强制SQL server进行类型转换,在上述情况下,它将将整个表列转换为string (而不是常量到int)来计算条件。对于大型表,它不会很快,也会阻止Server在本列中使用索引(如果有创建的话)。
发布于 2017-07-12 23:18:53
由于我没有数据可以检查,所以我不认为您的左联接(排除连接)是正确的,尽管在它之后有一个左连接然后是一个内部连接,所以我将它更改为一个左连接。
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')
)https://stackoverflow.com/questions/45066503
复制相似问题