0

我对 SQL 相当陌生,我完全陷入了这个查询中。

我已经为一个卫生组织编写了一个查询,该组织获取患者信息、他们的预约/哪个提供者看到了患者、他们在什么位置被看到以及在那次访问期间创建了哪些文件以及签核状态。

当结果返回时,查询的那部分是准确的。(由于在一次约会中生成了许多不同类型的文档,因此 1 位患者有很多行)

然而,我正在寻找的是一份已预约但未创建“X”文件的患者名单。我不想看到创建的其他文档列表;特别是未创建“X”的约会。请帮忙!

这是我首先解释的查询,显示患者/预约信息以及已生成的特定文档。

SELECT prs.person_nbr, prs.last_name + ', '+ prs.first_name as Patient, prs.date_of_birth
  , pm.description AS Provider
  , lm.site_id
  , appts.appt_type, appts.appt_date
  , pd.document_desc, pd.signoff_status

FROM person prs 
  , patient_documents pd
  , location_mstr lm
  , provider_mstr pm
  , appointments appts

WHERE prs.person_id = appts.person_id
  and appts.enc_id = pd.enc_id
  and appts.location_id = lm.location_id
  and lm.site_id is not null
  and appts.rendering_provider_id = pm.provider_id
  and ((pd.document_desc IN ('bms_master_im', 'Master_Im', 'BMS_ob_master','BMS_GYN_master', 'BMS_bh_master')
    and pd.signoff_status = 'P') 
    OR (pd.document_desc IN ('bms_master_im', 'Master_Im', 'BMS_ob_master',        'BMS_GYN_master', 'BMS_bh_master')
    AND pd.signoff_status IS NULL ))

ORDER BY lm.site_id, Provider

附加信息:尝试了所有建议。为了详细说明,这里有一个例子。

患者:JOHN SMITH 预约:20111201 创建的文档:work_letter、lab_req、master_im(master_im 是 IN 子句中列出的结果之一)

患者:JANE WILCOX 预约:20120704 创建的文件:lab_results、test_action、immunization_record。

对于 JOHN SMITH,结果将显示他有一个 master_im。基于已经编写的查询。

对于 JANE WILCOX,结果将排除她,因为她的文件未列在 IN 子句中。但是,我想在结果中看到她,以便我看到她没有创建 master_im 或 IN 子句中列出的任何其他文档。

我最终要寻找的是排除 JOHN SMITH,因为他的任命确实创建了 master_im 文档;并包括 JANE WILCOX,因为她有一个没有 master_im 的约会。(master_im 可以被我的查询的 IN 子句中的任何文档值替换)

***所有预约的患者 a) 没有创建“x”文档,或 b) 确实创建了“x”文档但签核状态 = P 或 NULL。(B很容易弄清楚,只需要a部分的帮助)。我们想忽略所有其他不包含在 x 中的文档。

x='bms_master_im'、'master_im'、'bms_ob_master'、'bms_gyn_master'、'bms_bh_master'、'ob_master'、'gyn_master'、'bh_master')

4

2 回答 2

0

编辑:

您需要在表上使用 JOIN 子句,并在文档表上使用左连接。

例如:

FROM person prs,
JOIN appointments appts ON prs.person_id = appts.person_id
JOIN location_mstr lm ON appts.location_id = lm.location_id   
JOIN provider_mstr pm ON ...

然后

LEFT JOIN patient_documents pd ON ...
于 2012-10-12T13:13:47.903 回答
0

您需要WHERE通过在包含您所说的“X”值的字段上添加条件来扩展您的子句。假设此字段位于 中patient_documents.code,您的 WHERE 子句变为:

WHERE prs.person_id = appts.person_id
and appts.enc_id = pd.enc_id
and appts.location_id = lm.location_id
and lm.site_id is not null
and appts.rendering_provider_id = pm.provider_id

and pd.code not in ('X', '...')

and ((pd.document_desc IN ('bms_master_im', 'Master_Im', 'BMS_ob_master','BMS_GYN_master',  'BMS_bh_master')
and pd.signoff_status = 'P') 
OR (pd.document_desc IN ('bms_master_im', 'Master_Im', 'BMS_ob_master',        'BMS_GYN_master', 'BMS_bh_master')
AND pd.signoff_status IS NULL ))

请注意,我在顶部和底部添加了带有空格的行。当然,如果包含代码的字段名称不同,则应修改字段引用。

于 2012-10-12T12:05:38.527 回答