SQL查询基于从另一个数据点的排除查找数据点

时间:2019-04-16 19:20:11

标签: sql

不确定标题的实用性,所以让我直接看一下。

下面是一个查询(和后续结果集),可让您大致了解我的工作方式:

select PRACT_ID, ID_Number, DocumentName
from Practitioner_ID_Numbers 
where PRACT_ID = 1193

PRACT_ID    ID_Number   DocumentName
1193    H9704   State License
1193    BR1918804   DEA Number
1193    10080428    Controlled Substance
1193    E51693  Medicare UPIN
1193    00419V  Medicare Provider
1193    None    Medicaid Provider

Pract_ID =人的唯一标识符

ID_Number =与文档关联的标识号

DocumentName =标识文档类型(例如,id_number可以是(555)555-1234,而documentname是“电话号码”)

所以我需要做的是编写一个查询,该查询标识没有文档名称类型'NPI number'条目的所有pract_id。

3 个答案:

答案 0 :(得分:1)

您可以使用聚合:

select PRACT_ID
from Practitioner_ID_Numbers 
group by PRACT_ID
having sum(case when DocumentName = 'NPI number' then 1 else 0 end) = 0;

答案 1 :(得分:1)

使用不存在很容易解决排除问题:

select distinct PRACT_ID
from Practitioner_ID_Numbers p
where not exists (
  select 1 from Practitioner_ID_Numbers
  where PRACT_ID = p.PRACT_ID and DocumentName = 'NPI number'
)

答案 2 :(得分:0)

您可以将一组从业人员的记录集加入Practitioner_ID_Numbers中,以确定哪些从业人员没有NPI。

在这里,我使用的是基于Practitioner_ID_Numbers的CTE,但是如果您有一个单独的表来存储从业人员,则可以改用它:

WITH 
    Practitioners(PRACT_ID) AS
    (
        SELECT DISTINCT PRACT_ID FROM Practitioner_ID_Numbers
    )
SELECT Practitioners.PRACT_ID
FROM Practitioners
    LEFT JOIN Practitioner_ID_Numbers AS ProviderNPIs ON
        ProviderNPIs.PRACT_ID = Practitioners.PRACT_ID
        AND ProviderNPIs.DocumentName = 'NPI number'
WHERE ProviderNPIs.PRACT_ID IS NULL

请注意,在JOIN中,我们表示仅关注DocumentName为“ NPI编号”的记录。然后,我们在WHERE子句中指出,我们想要具有空PRACT_ID的记录。这就是我们确定哪些从业人员缺少NPI的方法。

一些附加说明:

  • 您的命名约定有点古怪:下划线大写使用不一致会使查询变得棘手(该字段是否具有下划线?)
  • 为什么您需要将“无”存储为ID号?如果提供者缺少ID,值不是NULL(或表中根本不存在)吗?
  • 希望您的ID类型(州许可证,DEA号等)存储在单独的查找表中。
  • 您可能需要重新考虑属性名称DocumentName。像ID_Type之类的东西可能更合适。