比左连接子查询更好的解决方案?
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] 等中写入您想要的每种类型。只需将它们放在 [] 中,不需要其他字符如 ' 或其他任何字符。
如果只输入某些类型,则查询将不会显示其他类型的提供者。
如果有什么不对,请告诉我。
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] 等中写入您想要的每种类型。只需将它们放在 [] 中,不需要其他字符如 ' 或其他任何字符。
如果只输入某些类型,则查询将不会显示其他类型的提供者。
如果有什么不对,请告诉我。