我有一個數據庫存儲有關虛構人物的各種信息。有一個人的一般信息,如姓名,地址等,以及一些更具體的表格,爲每個人提供健康史和教育。 我現在想要做的是,基於相同的時間在同一所學校或同一個醫生或在同一醫院同時接受治療的相似之處,讓一個人獲得可能的聯繫。轉換SQL在哪裏加入
以下查詢對此工作正常(:id是有問題的人的id),但它非常慢(大約需要6secs才能得到結果)。
SELECT person.p_id as id, fname, lname, image FROM person WHERE
(person.p_id IN (
SELECT patient from health_case WHERE
doctor IN (SELECT doctor FROM health_case WHERE patient =:id)
OR center IN (SELECT hc2.center FROM health_case as hc1, health_case as hc2 WHERE hc1.patient = :id AND hc2.center = hc1.center AND (hc1.start <= hc2.end AND hc1.end >= hc2.start)))
OR person.p_id IN (
SELECT ed2.pupil FROM education as ed1, education as ed2 WHERE
ed1.school IN (SELECT school FROM education WHERE pupil = :id) AND ed2.school = ed1.school AND (ed2.start <= ed1.end AND ed2.end >= ed1.start)
))
AND person.p_id != :id
將其轉換爲使用JOIN子句的最佳方法是什麼?我似乎無法將我的頭圍繞在這些...
這應該可行,而且很好,但要小心,在即將考慮重構架構之前,您將達到大多數人推薦的連接數的限制。 – Zarathuztra
感謝您對模式結構的建議@Z! – Scott
經過一段時間的測試後,我認爲這有效,而且速度也非常快。無論如何分割查詢無疑是一個好主意,可以將可能的連接分類。 – powlomat