比左联接子查询更好的解决方案


TablePatient.Patient_ID(PK)
TableProviders.Encounter (joins to PK)
TableProviders.Provider_Type
TableProviders.Provider_ID
TableNames.Full_Name
TableNames.Provider_ID (joins to Table Names)

我想要一个查询,它将为所有Patient_IDs提供每个Provider ID的提供程序Full_Name

大约有 30 provider_types.

我已经使用左连接大量左连接来做到这一点。 运行需要很长时间,我认为我缺少一个技巧。

有什么帮助吗?

好的,我之前的回答完全不符合你的意思。您希望对表进行透视,以便在每行上有一个Patient_ID,每个Full_name每个provider_type。我假设每个患者只有一种类型的提供者,而不是更多;如果更多,每个患者将有不止一行,无论如何我认为这真的是不可能的。

这是我的枢轴解决方案。第一部分是使其更易于理解,因此我在子查询中创建一个名为 TABLE_PATIENT 的表。

WITH TABLE_PATIENT AS
(   
SELECT TablePatient.Patient_ID,
TableProviders.Provider_Type,
TableNames.Full_Name

FROM TablePatient LEFT JOIN
TableProviders on TablePatient.Patient_ID = TableProviders.Encounter 
LEFT JOIN
TableNames on TableNames.Provider_ID = TableProviders.Provider_ID
group by TablePatient.Patient_ID,
TableProviders.Provider_Type,
TableNames.Full_Name
)
SELECT *
FROM TABLE_PATIENT
PIVOT
(
    min(Full_name)
    for Provider_type in ([type1], [type2],[type3])
) AS PVT

因此,TABLE_PATIENT每个患者只有许多行,每行有一个提供者,枢轴将所有内容放在一行上。如果有什么地方不起作用,请告诉我。

您需要在[type1],[type2]等中编写所需的每种类型。只需将它们放在 [] 中,不需要其他字符作为 ' 或其他任何东西。

如果仅放置某些类型,则查询不会显示其他类型的提供程序。

如果有什么地方不起作用,请告诉我。

如果我明白你的意思,你只想按患者 ID 然后按提供者 ID 对答案进行分组。全名在提供商 ID 上是唯一的,对吗?

这应该是这样的

SELECT TablePatient.Patient_ID,
TableProviders.Provider_ID,
TableNames.Full_Name

FROM TablePatient LEFT JOIN
TableProviders on TablePatient.Patient_ID = TableProviders.Encounter 
LEFT JOIN
TableNames on TableNames.Provider_ID = TablerProviders.Provider_ID
group by TablePatient.Patient_ID,
TableProviders.Provider_ID,
TableNames.Full_Name

您可以按TableNames.Full_Name分组,也可以选择First(TableNames.Full_Name)例如,如果提供商 ID 确实有全名。

注意:我使用了SQL服务器语法,与Oracle可能存在差异。

相关内容

  • 没有找到相关文章

最新更新