查找未附加特定值的记录

时间:2012-10-12 11:55:44

标签: sql

我对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条款中列出。但是,我希望在结果中看到她,以便我看到她没有创建IN子句中列出的master_im或任何其他文档。

我最终想要的是排除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')

2 个答案:

答案 0 :(得分:0)

您需要通过在包含" X"的字段上添加条件来扩展您的WHERE子句。你说的价值观。假设此字段位于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 ))

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

答案 1 :(得分: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 ...