避免在SQL Query中重复

时间:2011-12-13 04:26:51

标签: sql join

我有三张桌子。

项目

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

增强功能

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 个答案:

答案 0 :(得分:2)

我相信你想使用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,以便RDBMS不必执行额外的步骤来过滤掉重复的记录(我认为这不是必需的)。

答案 1 :(得分:0)

我认为你正在寻找别名

尝试这样的事情:

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

答案 2 :(得分:0)

如果您可以解释表格的关系,它会有所帮助。在我看来,好像每个项目可能都有相关的增强项目和/或相关的支持项目。如果我理解正确,那么下面的内容就可以了。

    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