3个字段的关系 表:患者更新表格:TextMaster

问题描述

我有 2 张桌子:

表:患者更新

Table: PatientsUpdates

表格:TextMaster

Table: TextMaster

我需要最终结果:

Current status

最终结果是医院变性手术科所有患者的当前状态,但患者姓名的标题是从TextMaster表中选择的。

来自此 sql

SELECT disTINCT "PatientID",FirsT_VALUE("TextSource") 
    OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextSource" IS NOT NULL THEN "EffectiveDate" END DESC) "TextSource",FirsT_VALUE("TextGroup") 
    OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextGroup" IS NOT NULL THEN "EffectiveDate" END DESC) "TextGroup",FirsT_VALUE("TextIndex") 
    OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextIndex" IS NOT NULL THEN "EffectiveDate" END DESC) "TextIndex",FirsT_VALUE("FirstName") 
    OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "FirstName" IS NOT NULL THEN "EffectiveDate" END DESC) "FirstName",FirsT_VALUE("LastName") 
    OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "LastName" IS NOT NULL THEN "EffectiveDate" END DESC) "LastName"
FROM "PatientsUpdates";

我得到了这个查询结果:

Firebird query

你能帮我用正确的 sql 教我用 TextDetail 或比上面显示的更好的 sql 替换 TextSource、TextGroup 和 TextIndex 吗?

解决方法

如果 TextXXX"TextMaster" 的外键的一部分,那么对于单行,它们要么全为空,要么填充在一起。在这种情况下,您只需 left join"TextMaster" 即可获取信息。

SELECT DISTINCT pu."PatientID",FIRST_VALUE(tm."TextDetail") 
    OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN "TextDetail" IS NOT NULL THEN "EffectiveDate" END DESC) "TextDetail",FIRST_VALUE(pu."FirstName") 
    OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN pu."FirstName" IS NOT NULL THEN "EffectiveDate" END DESC) "FirstName",FIRST_VALUE(pu."LastName") 
    OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN pu."LastName" IS NOT NULL THEN "EffectiveDate" END DESC) "LastName"
FROM "PatientsUpdates" pu
left join "TextMaster" tm
  using ("TextSource","TextGroup","TextIndex");

我使用 LEFT JOIN 而不是 INNER JOIN 是因为您的问题中缺少信息,什么可以为空,什么组合可以为空,以避免意外删除会提供必要信息的行.但是,如果始终填充 "TextSource""TextGroup""TextIndex",或者在还填充 "FirstName" 和/或 "LastName" 时始终填充,那么您可以使用INNER JOIN 代替。