在左连接中使用相关子查询
Using a Correlated Subquery within a Left Join
我需要重新审视这个问题。在没有深入了解这段代码的情况下,我的问题是我正在做一个左连接以从 TXP_Digital_Signatures (tds) table 中提取,它将签名存储到最新版本的治疗计划 (txp_master txp)。此代码所做的是返回 tds.signed 为空(无签名)或标记为 N(否)的结果。这行得通,但这份报告所做的是向人们展示否需要什么才能变成是,但这会将否留在后面,所以如果有更新的是,那么 tds.plan_id 那个版本中的否仍在将 plan_id 拉到我不再需要它的地方,最近的签名状态是 Y(是)等。下面添加到 where 语句的代码片段有效,但它隐藏了所有否,即使有不是更新的 Y(是)。
tds.date = (select Max(date) from TXP_Digital_Signatures where tds.plan_id = txp.plan_id)
任何人都可以想出一种方法来向左连接添加一个相关的子查询,这样它只为每个 tds.plan_id 提取 max(tds.date) 或如何重新处理我的 where 语句没有更新的 yes 的 no 和 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
如果您更正子查询,您的查询应该可以正常工作,如下所示:
(select Max(date) from TXP_Digital_Signatures x where x.plan_id = tds.plan_id)
目前,您没有过滤子查询 TXP_Digital_Signatures
。
另一件需要注意的事情是,您在 TXP_Digital_Signatures tds
上有一个 LEFT JOIN
,但您将其包含在 WHERE
子句中。这会将其转换为 INNER JOIN
。所以决定你需要什么加入并相应地改变。
如果您希望结果与 TXP_Digital_Signatures tds
无关,则将这些条件移至 ON
子句。
如果您只想要基于 TXP_Digital_Signatures tds
的结果,则更改为 INNER JOIN
我需要重新审视这个问题。在没有深入了解这段代码的情况下,我的问题是我正在做一个左连接以从 TXP_Digital_Signatures (tds) table 中提取,它将签名存储到最新版本的治疗计划 (txp_master txp)。此代码所做的是返回 tds.signed 为空(无签名)或标记为 N(否)的结果。这行得通,但这份报告所做的是向人们展示否需要什么才能变成是,但这会将否留在后面,所以如果有更新的是,那么 tds.plan_id 那个版本中的否仍在将 plan_id 拉到我不再需要它的地方,最近的签名状态是 Y(是)等。下面添加到 where 语句的代码片段有效,但它隐藏了所有否,即使有不是更新的 Y(是)。
tds.date = (select Max(date) from TXP_Digital_Signatures where tds.plan_id = txp.plan_id)
任何人都可以想出一种方法来向左连接添加一个相关的子查询,这样它只为每个 tds.plan_id 提取 max(tds.date) 或如何重新处理我的 where 语句没有更新的 yes 的 no 和 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
如果您更正子查询,您的查询应该可以正常工作,如下所示:
(select Max(date) from TXP_Digital_Signatures x where x.plan_id = tds.plan_id)
目前,您没有过滤子查询 TXP_Digital_Signatures
。
另一件需要注意的事情是,您在 TXP_Digital_Signatures tds
上有一个 LEFT JOIN
,但您将其包含在 WHERE
子句中。这会将其转换为 INNER JOIN
。所以决定你需要什么加入并相应地改变。
如果您希望结果与 TXP_Digital_Signatures tds
无关,则将这些条件移至 ON
子句。
如果您只想要基于 TXP_Digital_Signatures tds
的结果,则更改为 INNER JOIN