2017-10-20 65 views
0

我是SQL和DBMS的新手,所以我仍然在學習最佳實踐,並探索什麼是可能的和不可能的。我在Postgres中設計了一個數據庫,其中包含6個表:具有外鍵的衛星數據與CROP數據,其中FK具有FIELDS,FK具有FARMS,具有MET STATION和MET DATA的外鍵,該外鍵還具有與MET STATION的外鍵。 (我希望我已經解釋了,好吧..)SQL查詢從兩個表中輸出數據,這些數據不是通過PK/FK直接鏈接的,而是通過多個其他錶鏈接的?

我假設我可以得到一個輸出表,其中包含距彼此最遠的兩個表(衛星數據和MET數據)的信息,因爲有一個鏈接通過所有其他表通過PK和FKs ..但是我無法制定SQL來這樣做。 (我可以設想一個很長的SQL來做到這一點..但如果有可能,我希望有一個更有效的方法..)

我的問題是:是否有SQL做我想在上面一個有效的方式與我已經完成的相同數據庫設計?還是應該重新設計我的數據庫,以便每個需要鏈接的表都直接鏈接而不是通過多個其他表?

在此先感謝您的幫助!

+1

請** [編輯] **您的問題,並添加一些[樣本數據](http://plaintexttools.github.io/plain-text-table/)和基於該數據的預期輸出。 [**格式化文本**](http://stackoverflow.com/help/formatting)請,[**沒有屏幕截圖**](http://meta.stackoverflow.com/questions/285551/why-may -i-不上傳圖像-的代碼上那麼當灰化-A-問題/ 285557#285557)。 ** [**]您的問題 - 請勿**在論壇中發佈代碼或其他信息。 –

+0

我試圖放入示例數據,但純文本表格粘貼在預覽格式化有趣,看起來一團糟。我認爲這樣的描述足以讓某人回答 - 雖然缺少樣本數據的道歉。 –

+0

http://stackoverflow.com/help/formatting –

回答

0
select * 
from one t1 
join six t6 ON exists (
     select * 
     from two t2 
     join three t3 on t3.two_id = t2.two_id 
     join four t4 on t4.three_id = t3.three_id 
     join five t5 on t5.five_id = t4.five_id 
     where t2.one_id = t1.one_id 
     and t5.six_id = t6.six_id 
     ); 

現在,你只需要更換的實際名稱表/列名(你沒有提供)

+0

感謝您的回覆。由於數據通常是從兩個表中調用的,所以MET數據和衛星數據表直接由PK和FK鏈接是否更好?從理論上講,這是額外的存儲需求,所以這就是我設計數據庫的原因,因爲我相信從數據存儲的角度來看,這是更高效的方式。 –

+0

「高效」在數據庫建模中具有不同的含義。這關乎正確性和緊湊性以及約束最小化。 https://en.wikipedia.org/wiki/Database_normalization – joop

0

查詢並不難。它看起來像這樣:

select . . . 
from met_station ms join 
    farms f 
    on ms.farm_id =f.farm_id join 
    fields fi 
    on f.field_id = fi.field_id join 
    crops c 
    on c.crop_id = f.crop_id join 
    satellites s 
    on s.satellite_id = c.satellite_id; 

如果我正確理解數據模型,這些都是1-n關係,並且沒有處理連接的問題。你只需要列出它們。而且,假設連接鍵是主鍵(在一個表中),性能應該沒問題。

當某些表格是n-m時,您確實遇到了挑戰。處理多個這樣的關係通常涉及在加入之前的聚合。

相關問題