如何使用单个查询从多个多对多关系表中获取数据

时间:2018-04-17 07:02:58

标签: sql-server

enter image description here

我在我的数据库中有这个表格场景。我想使用表单名称在单个查询中从所有这些表中获取数据,它是唯一的。我不知道有多少与formNumber相关的其他数据。我尝试使用FolloWing查询,但我没有得到结果。

select [FormNumber], [FormName], [ProcedureName] ,[MethodName], [DeptName], [SectionName]
            FROM FormDetail AS fd INNER JOIN FormMaster AS fp ON fd.[FormId] = fp.[FormId]
            INNER JOIN FProcedure AS fpr ON fp.[ProcId] = fpr.[ProcId]   
            INNER JOIN FMethod AS fm ON fp.[MethodId] = fm.[MethodId]
            INNER JOIN FDepartment AS fdp ON fp.[DeptId] = fdp.[DeptId]
            INNER JOIN FSection AS fs ON fp.[SecId] = fs.[SecId]
            WHERE [FormNumber] = '1026 -3'

我得到了以下结果 enter image description here

返回正确的结果,但它会重复所有其他记录的数据。 E.G如果有两个部门和十二个部分,那么它将首先填充第一部门的12部分,然后再填充所有部分的第二部分。我希望它不重复E.g如果只有两个部门,它只获取两个部分而12个部分只有12个部分不会重复另一个数据。

1 个答案:

答案 0 :(得分:0)

由于您在一个表中保留所有多对多映射,我相信您需要为每个映射执行子查询。在下面的示例中,我只有三个具有相似名称的表,但通过添加子查询以及为子查询ID和表单ID添加条件,可以轻松扩展查询。我也使用distinct来避免重复。

SELECT distinct number, mq.name AS method_name, pq.name AS proc_name
FROM form f, master m,
(SELECT m.fid as id, name FROM master m JOIN proc p ON m.pid = p.id) AS pq,
(SELECT m.fid as id, name FROM master m join method me ON m.mid = me.id) AS mq
WHERE m.fid = f.id
  AND pq.id = f.id
  AND mq.id = f.id