首页 > 解决方案 > SQL 一对多关系,重复/结果作为唯一行返回

问题描述

我有一个数据库,一些表有一对多的关系。如何消除作为自己唯一行返回的结果?

例如,我有一个倡议表,一个倡议可以有许多资金需求。当我执行内部连接时,我得到了结果,但看起来行正在重复以从资金表中输出一个唯一值。

结果

从结果来看应该是这样的

第 3、4、5 行应在一行中列出所需资金的结果

Description | Acad_priority_1 | Acad_priority_2 | beginning_fiscal_year |
Develop...  |  false          | true            | 2018/2019             |
                                                | 2018/2019             |
                                                | 2019/2020

您能否引导我朝着正确的方向前进,或者告诉我应该如何构建 SQL 来实现这一目标?

SQL:

    SELECT plan_master.plan_id,
       plan_master.date_submitted,
       plan_master.filename,
       initiative_master.plan_id,
       initiative_master.NAME,
       initiative_master.acad_priority_1,
       funding.initiative_id,
       funding.beginning_fiscal_year
FROM   plan_master
       JOIN initiative_master
               ON plan_master.plan_id = initiative_master.plan_id
       JOIN funding
               ON initiative_master.initiative_id = funding.initiative_id  
ORDER BY Filename




|plan_id|date_submitted|filename|plan_id|NAME|acad_priority_1|initiative_id|begginning_fiscal_year|
|16F44FFE-5434-4E52-9D9A-F45C0A49D8E2|2018-12-03|1.txt|16F44FFE-5434-4E52-9D9A-F45C0A49D8E2|Space Utilization framework|false|8CCE0311-0E3C-467D-B675-04817A473056|2018/2019
|16F44FFE-5434-4E52-9D9A-F45C0A49D8E2|2018-12-03|1.txt|16F44FFE-5434-4E52-9D9A-F45C0A49D8E2|Space Utilization framework|false|8CCE0311-0E3C-467D-B675-04817A473056|2019/2020
|16F44FFE-5434-4E52-9D9A-F45C0A49D8E2|2018-12-03|1.txt|16F44FFE-5434-4E52-9D9A-F45C0A49D8E2|Space Utilization framework|false|8CCE0311-0E3C-467D-B675-04817A473056|2020/2021

标签: sqlsql-serverdatabaseone-to-many

解决方案


一个简单的连接返回一个 cartesion 产品。如果一个表有 2 行,另一个有 3 行,那么将有 6 行数据。需要对数据做不同的处理。你可以这样做:

SELECT plan.date_submitted,
   plan.filename,
   plan.department,
   plan.last_name,
   plan.first_name,
   plan.email,
   plan.mission_statement,
   plan.vision_statement,
   plan.goals_objectives,
   initiative.Name, 
   initiative.description,
   initiative.acad_priority_1,
   initiative.acad_priority_2,
   initiative.acad_priority_3,
   initiative.acad_priority_4,
   initiative.acad_priority_5,
   initiative.acad_priority_6
FROM plan_master as plan 
inner join (select distinct init.plan_id, init.NAME,
   init.description,
   init.acad_priority_1,
   init.acad_priority_2,
   init.acad_priority_3,
   init.acad_priority_4,
   init.acad_priority_5,
   init.acad_priority_6,
   init.operational_sustainability,
   init.people_plan,
   funding.beginning_fiscal_year from initiative_master as init
   join funding on funding.initiative_id = init.initiative_id ) as initiative  
    ON plan.plan_id = initiative.plan_id
ORDER BY Filename

推荐阅读