2014-09-24 92 views
0

我的關係數據庫中有3個不同的實體。名爲'Competencia'的實體與另外兩個實體'Nivel','Funcion'或兩者都沒有關係。 'CompetenciaTipo'是'Competencia'中的字段,它告訴我'Competencia'是否與'Nivel','Funcion'或者他們沒有關係。在這兩種情況下,我都有中間表來處理這些多對多關係,您可以在下圖中查看我的ER圖的一部分。關聯3個SQL實體的建議

ER diagram

我需要建立一個SQL查詢來引進「Competencia」表中的所有行,並與其他表(如果有的話)的關係,但似乎這將是一個複雜的查詢。

您認爲我的模型設計是否合適?你有任何其他建議可以得到相同的結果嗎?

感謝

+0

僅基於表結構和解釋提供的表結構很好,適用於大多數情況。 – 2014-09-24 06:04:58

回答

1

選擇Competencia Funcions: -

SELECT c.*, f.* -- 
FROM Competencia c 
LEFT JOIN CompetenciaFuncion cf ON cf.CompetenciaId = c.CompetenciaId 
LEFT JOIN Funcion f ON f.FuncionId = cf.FuncionId 
WHERE {......insert additional conditions..... } 

選擇Competencia Nivels: -

SELECT c.*, n.* -- 
FROM Competencia c 
LEFT JOIN CompetenciaNivel cn ON cn.CompetenciaId = c.CompetenciaId 
LEFT JOIN Nivel n ON n.NivelId = cn.NivelId 
WHERE {......insert additional conditions..... } 

LEFT JOIN的確保所有從competencia表的詳細返回,並從什麼Funcion/Nivel表。注意:大多數時候你想要在網格(或類似的)中顯示結果,那麼SELECT中的c.*部分將被c.CompetenciaId所取代,這樣你就可以得到密鑰,但不要重複不必要的競爭表。

如果這些查詢一遍又一遍地使用,這些查詢也可以構成VIEWs的基礎。

+0

如果我想在同一時間將'Competencia'與'Funcion'和'Nivel'聯繫起來,會發生什麼?有了這個例子,我想我需要將兩個查詢結果合併爲一個額外的工作。 – 2014-09-24 14:27:12

+0

是的,這是正確的。通常情況下,雖然不會一次從全部3個表中檢索所有細節(單行),因爲數據會跨多行復制。最好將其視爲親子關係。無需您檢索您想要的父母,然後在單獨的結果集中將相關的孩子檢索給這些父母。 – 2014-09-24 14:50:00