Избегайте повторения в SQL Query - PullRequest
2 голосов
/ 13 декабря 2011

У меня есть три таблицы.

Проект

Project ID | Project Name
         1 | Project 1
         2 | Project 2  

Улучшение Pjt

Enh ID | Enh Name   | Project ID
    1  | Enh Name 1 | 1
    2  | Enh Name 2 | 1
    3  | Enh Name 3 | 2

Таблица поддержки

Supp. ID | Supp. Proj Name | Project ID
       1 | Supp Name 1     | 1
       2 | Supp Name 2     | 2
       3 | Supp Name 3     | 2

Я хочу создать таблицу запросов, в которой перечислены все проекты и связанные с ними Enh.Проекты и поддержка проектов.Я использовал объединения, но результат содержит повторяющиеся столбцы в таблице поддержки, что довольно сложно для отчета.

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Я считаю, что вы хотите использовать union all. Это может быть начало:

select 
  'Enhancement: ' type_,
   p.name,
   e.name
from 
   project p,
   enhancement e
where
   p.id = 
   e.project_id
      UNION ALL
select 
  'Support: ' type_,
   p.name,
   s.name
from 
   project p,
   support s
where
   p.id = 
   s.project_id;

Фон для моего предложения:

Я полагаю, что первоначальные постеры хотят избежать следующего повторения

select
  p.name,
  e.name,
  s.name
from
  project     p,
  enhancement e,
  support     s
where
  p.id = e.project_id and
  p.id = s.project_id ;

результат в

NAME            NAME            NAME
--------------- --------------- ---------------
Project one     Enhancement 2   Support 1
Project one     Enhancement 1   Support 1
Project two     Enhancement 3   Support 2
Project two     Enhancement 3   Support 3

То есть: Улучшение 3 и Поддержка 1 возвращается дважды, что (вероятно) нежелательно.

Однако, с моим предложением, запрос возвращает

TYPE_         NAME            NAME
------------- --------------- ---------------
enhancement:  Project one     Enhancement 1
enhancement:  Project one     Enhancement 2
enhancement:  Project two     Enhancement 3
support:      Project one     Support 1
support:      Project two     Support 2
support:      Project two     Support 3

, то есть каждый случай улучшения и поддержки возвращается ровно один раз.

Я выбрал UNION ALL вместо UNION, чтобы СУБД не выполняла дополнительный этап фильтрации дублированных записей (что, я считаю, не нужно).

0 голосов
/ 13 декабря 2011

И было бы полезно, если бы вы могли объяснить взаимосвязи ваших таблиц. Мне кажется, что каждый проект может иметь связанный проект улучшения и / или связанный проект поддержки. Если я вас правильно понимаю, то сработает следующее.

    SELECT
    p.ProjectID,
    p.ProjectName,
    e.EnhName,
    s.SuppProjName
    FROM
    Project p 
    LEFT JOIN EnhanchementPJT e ON p.ProjectID = e.ProjectID
    LEFT JOIN SupportTable s ON p.ProjectID = s.ProjectID
0 голосов
/ 13 декабря 2011

Я думаю, что вы ищете псевдонимы

попробуйте что-то вроде этого:

select p.name as project_name1, // the 'as' might be superfluous ... not sure right now
       e.name as enhancement_name1
from project as p, enhancement as e // whataver the desired jon condition is
where p.id = e.project_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...