2014-10-30 91 views
3

我有一個複雜的查詢,我需要弄清楚,但我在編寫查詢和子查詢方面不夠精通。SQL查詢:如何選擇記錄,但是如果存在父記錄,請選擇它的最新子項

問題:我需要檢索唯一的病人記錄,但如果記錄有一個非空master_patient_id,我需要子查詢或加入對master_patient表,查詢最近的(created_at DESC LIMIT 1)兒童患者該master_patient。

原因是我們的系統將爲同一患者創建一個新的患者記錄,如果他們被重新接收到同一個設施。在創建給定患者的第二條記錄時,我們還創建了一個master_patient記錄,以將兩個患者記錄與它關聯,以便系統可以知道他們是同一患者。

現在,我需要顯示非重複患者的列表。所以我需要有一個能夠從患者記錄中獲取患者的查詢,但需要查詢master_patient表並只檢索與其master_patient關聯的最新患者。

耐心表具有:ID,名稱master_patient_id 和患者belongs_to的master_patient但是存在不是必需的。

主患者表中只有一個id和has_many患者。

期望的結果:應該是唯一的病歷,但發現如果患者本身中是獨一無二的唯一方法是查詢master_patient表,看是否有患者belong_to它,然後只檢索最新的患者(兒master_patient)。

我不能根據master_patient查詢我的查詢,因爲那些只有1條記錄的患者不存在。我應該使用某種類型的連接或子查詢嗎?

更新:感謝@τεκ我能夠調整自己的查詢中Postgres的工作:

更新2: 1更微小的調整來查詢,以使其更短,糾正空ID爲返回:

SELECT MAX(patients.id) as id, * 
FROM "patients" 
JOIN (
    SELECT MAX(created_at) AS created_at, 
     patient_master_id, 
     COALESCE(patient_master_id, id) pm_id 
    FROM patients 
    GROUP BY patient_master_id, 
     COALESCE(patient_master_id, id) 
) s 
ON (s.pm_id = patients.id or s.patient_master_id = patients.patient_master_id) 
AND s.created_at = patients.created_at 
GROUP BY patients.id, s.created_at, s.patient_master_id, s.pm_id 

回答

2
select max(id) as id from patient p 
join (select 
    max(created_at) as created_at, 
    master_patient_id, 
    case when master_patient_id is null then id else null end as id 
    from patient 
    group by master_patient_id, case when master_patient_id is null then id else null end 
) s on (s.id = p.id or s.master_patient_id = p.master_patient_id) and s.created_at = p.created_at 

有可能是一個簡單的,Postgres的特定的方式來做到這一點,但我不知道的Postgres。在T-SQL中是cross apply

+0

這看起來像是有效的。我現在正在運行一些測試。我會盡快回復。謝謝! – DiegoSalazar 2014-10-30 17:48:58