2014-09-24 59 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