【问题标题】:Better solution than left join subqueries?比左连接子查询更好的解决方案?
【发布时间】:2016-07-19 04:55:39
【问题描述】:
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

我已经使用左连接做了很多左连接。运行需要很长时间,我认为我缺少一个技巧。

有什么帮助吗?

【问题讨论】:

    标签: oracle performance subquery left-join correlated-subquery


    【解决方案1】:

    如果我理解您的意思,您只需按患者 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 server 语法,与 Oracle 可能存在差异 ..

    【讨论】:

    • 让我澄清一下:每个“患者 ID”都是一行。每个“提供者类型”都应该有一列。这些列应包含“提供者全名”
    • 一种提供商类型是否只有一个提供商 ID?或者您可以只为一种类型拥有多个 ID?既然你澄清了,我就更好理解了。你需要做一个支点。只要回答提供者 ID 和提供者类型之间的关系是否唯一,我就可以编写代码。否则在网络上寻找“pivot”
    • 提供者类型有多种,提供者ID也有多种。
    • 是的,但是它们之间的关系是独一无二的吗?或者您可以为同一提供商类型提供两个 ID 吗?在这种情况下,一个患者 ID 可以有两个相同类型的提供者 ID 吗?
    • 是的,同一提供商类型可以有两个 ID。不可以。每位患者只能拥有每种提供者类型中的一种。
    【解决方案2】:

    好的,我之前的回答与您的意思完全不符。您希望旋转表格以在每一行上都有一个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] 等中写入所需的每种类型。只需将它们放在 [] 中,不需要其他字符作为 ' 或其他任何字符。

    如果你只放一些类型,那么查询将不会显示其他类型的提供者。

    如果有什么问题,请告诉我。

    【讨论】:

    • 很高兴听到这个消息。那你能确认我的回答吗? :)
    • 有没有办法在输出中添加“CASE”?在为“TABLE_PATIENT”创建别名“T”之后,我尝试了“”、“TABLE_PATIENT.”和“T.*”,但这些都不起作用。
    • 如果不再是 table_patient 而是 PVT 表的名称,我不确定是否完全理解,但请尝试 PVT.blabla 的案例
    • 似乎无法在输出中恢复“Patient_ID”。每行都是一个唯一的 Patient_ID,但我需要知道值。
    • 我在另一篇文章中提出了这个问题。也许你可以帮忙。 “在连接的数据透视表中查找我丢失的列”
    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 2018-03-10
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多