SQL Отношения один ко многим, дубликаты / результаты возвращаются в виде уникальных строк - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть база данных, и некоторые таблицы имеют отношения один ко многим.Как исключить результаты, возвращаемые в виде отдельной уникальной строки?

Например, у меня есть таблица инициатив, и у инициативы может быть много требований к финансированию.Когда я выполняю внутреннее объединение, я получаю результаты, но похоже, что строки дублируются, чтобы вывести уникальное значение из таблицы финансирования.

Results

Из результатов должно быть так

Строка 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

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

2 начальных значения финансового года нельзя объединить в одну строку, если вы не хотите объединить их запятыми (или другим разделителем) или написать функцию для отображения значения в виде диапазона, например 2018-2020.Тем не менее, вы можете избавиться от 4-й записи, используя отдельные или используя нижеупомянутые предложения over / partition by.

Если вы не возражаете, можете ли вы выполнить следующий запрос и предоставить результаты, которые помогут мне определитьпроблема дублирования:

SELECT plan_master.plan_id,
       plan_master.date_submitted,
       plan_master.filename,
       plan_master.department,
       plan_master.last_name,
       plan_master.first_name,
       plan_master.email,
       plan_master.mission_statement,
       plan_master.vision_statement,
       plan_master.goals_objectives,
       initiative_master.plan_id,
       initiative_master.NAME,
       initiative_master.description,
       initiative_master.acad_priority_1,
       initiative_master.acad_priority_2,
       initiative_master.acad_priority_3,
       initiative_master.acad_priority_4,
       initiative_master.acad_priority_5,
       initiative_master.acad_priority_6,
       initiative_master.operational_sustainability,
       initiative_master.people_plan,
       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

Как только вы дойдете до причины, вы можете либо использовать более выгодное предложение объединения (несколько условий), добавить предложение where или использовать предложение OVER вместе сPARTITION BY предложение для фильтрации данных на основе ROW_NUMBER ().

0 голосов
/ 12 декабря 2018

Простое объединение возвращает продукт карт.Если в одной таблице 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
...