在左连接中使用相关子查询

时间:2017-06-08 14:43:09

标签: sql sql-server-2008-r2 left-join where

我需要对此查询有一套新的看法。在这段代码中没有深入了解我的问题是我正在进行左连接以从TXP_Digital_Signatures(tds)表中提取,该表将签名存储到最新版本的治疗计划(txp_master txp)。这段代码正在做的是将tds.signed为空(无签名)或标记为N(否)的结果。这是有效的,但是这份报告所做的是向人们展示不需要成为什么,但是这样就留下了No left,所以如果有更新的是,那么那个版本的td中的No。 plan_id它仍然会拉出plan_id,在最近的签名状态为Y(是)等的情况下我不再需要它。下面的代码片段添加到where语句中,但它隐藏了所有的No,即使没有更新的Y(是)。

tds.date = (select Max(date) from TXP_Digital_Signatures where tds.plan_id = txp.plan_id)

任何人都可以想到一种方法来向左连接添加一个相关的子查询,所以它只为每个tds.plan_id提取max(tds.date)或者如何重写我的where语句,这样就没有了#n如果没有更新的肯定而且null仍然显示出来。我真的不想将整个报告作为分组报告重做,如果我能帮助它,我觉得它会打破我的大量内容并且基本上让我从头开始重做这个报告。 SQL 2008 R2

SELECT  case_status,
    CONVERT(CHAR(10), episode_open_date, 101)AS 'Enrolled' ,
    txp.patient_id, 
    p.lname+', ' + p.fname AS 'Client',
    CONVERT(CHAR(10), txp.effective_date, 101)AS 'Effective', 
    CONVERT(CHAR(10), next_review_date, 101)AS 'Review',
    txp.signed,
    (SELECT location_code FROM staff s WHERE s.staff_id = txp_coordinator_id) AS 'Clinic',
    (SELECT s.lname+', ' +s.fname FROM staff s WHERE s.staff_id = txp_coordinator_id) AS 'Coordinator',
    (SELECT s.lname+', ' +s.fname FROM staff s WHERE s.staff_id = ts.team_member_id ) AS 'Team', 
    ts.signed,
    tds.signed as 'Patient Sig'
FROM txp_master txp join patient p ON p.patient_id = txp.patient_id and p.episode_id = txp.episode_id
    join txp_signature ts on ts.plan_id = txp.plan_id and ts.version_no = txp.version_no and ts.team_member_id <> txp.txp_coordinator_id
    left join TXP_Digital_Signatures tds on tds.plan_id = txp.plan_id

where p.case_status = 'A' and 
txp.status <> 'er' and patient_signed_date is null 
and tds.signed is null or tds.signed = 'N'
and txp.effective_date > '2016-12-31 00:00:00.000'
and tds.date = (select Max(date) from TXP_Digital_Signatures where tds.plan_id = txp.plan_id)

order by patient_id

1 个答案:

答案 0 :(得分:2)

如果您更正子查询,您的查询应该有效,如下所示:

(select Max(date) from TXP_Digital_Signatures x where x.plan_id = tds.plan_id)

目前,您没有过滤子查询TXP_Digital_Signatures

需要注意的另一件事是,LEFT JOIN上有TXP_Digital_Signatures tds,但您将其包含在WHERE子句中。这会将其转换为INNER JOIN。因此,请确定您需要的联接并进行相应更改。

如果您想要的结果与TXP_Digital_Signatures tds无关,请将这些条件移至ON子句。

如果您只想要基于TXP_Digital_Signatures tds的结果,请更改为INNER JOIN