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

Better solution than left join subqueries?

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 提供提供商的 Full_Name 每个 Provider ID

大约有 30 个provider_types

我已经使用大量的左连接实现了这一点。 运行 需要很长时间,我想我缺少一个技巧。

有什么帮助吗?

如果我理解您的意思,您只想按患者 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 或 select First(TableNames.Full_Name) 分组,例如,如果全名对于提供商 ID 来说确实是唯一的。

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

好的,我之前的回答与您的意思完全不符。您希望将 table 调整为每行一个 Patient_ID,每个 Full_name 对应每个 provider_type。我假设每个患者只有一种类型的提供者,而不是更多;如果多的话,每个病人就不止一行,反正我觉得不太可能。

这是我的枢轴解决方案。第一部分是为了让它更容易理解,所以我在子查询中创建了一个名为 TABLE_PATIENT 的 table。

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] 等中写入您想要的每种类型。只需将它们放在 [] 中,不需要其他字符如 ' 或其他任何字符。

如果只输入某些类型,则查询将不会显示其他类型的提供者。

如果有什么不对,请告诉我。