1

对于 Oracle-Noob 问题,我很抱歉,但我在尝试运行的查询时遇到问题,似乎无法弄清楚如何编写它。

如果我将查询分成两部分,我会得到每个部分的正确信息。看:

select   NVL (skill.category, 'Total:') "Skill Category",
         count (training.code) "# of Trainings"
from     skill join training on skill.code = training.code
group by rollup (skill.category);

返回:

Skill Category  # of Trainings
--------------- --------------
Database                     2
HR                           1
Leadership                   1
Printing                     1
Sales                        3
Web Design                   5
Total:                      13

同样,对于第二个查询,我得到以下信息:

select NVL (skill.category, 'Total:') "Skill Category",
       count (project.code) "projects req training"
from   skill join project on skill.code = project.code
group by rollup (skill.category);

Skill Category  projects req training
--------------- ---------------------
Database                            2
Printing                            3
Web Design                          5
Total:                             10

但是,当我尝试组合这些查询时,我的结果被搞砸了:

select NVL (skill.category, 'Total:') "Skill Category",
           count (training.code) "# of Trainings",
           count (project.code) "Projects Requiring Skill"
from skill join training on skill.code = training.code
           left join project on training.code = project.code
group by rollup (skill.category);

Skill Category  # of Trainings Projects Requiring Skill
--------------- -------------- ------------------------
Database                     4                        4
HR                           1                        0
Leadership                   1                        0
Printing                     3                        3
Sales                        3                        0
Web Design                  13                       13
Total:                      25                       20

我在这里做错了什么?我非常感谢任何帮助,如果我遗漏了一些明显的东西,我很抱歉!

4

1 回答 1

0

问题是您加入了乘以数据。您有两个 1-n 关系,在技能和培训之间以及在培训和项目之间。结果是组合的乘法。

解决办法是分别做两个汇总,然后用join合并:

select st.*, "projects req training"
from (select NVL(skill.category, 'Total:') "Skill Category",
             count(training.code) "# of Trainings"
      from skill left outer join
           training
           on skill.code = training.code
      group by rollup (skill.category)
     ) st join
     (select NVL(skill.category, 'Total:') "Skill Category",
             count(project.code) "projects req training"
      from skill left outer join
           project
           on skill.code = project.code
      group by rollup (skill.category)
     ) sp
     on st."Skill Category" = sp."Skill Category"

在这个版本中,我left outer join在子查询中使用,以确保每个子查询返回所有技能。这使我可以inner join在下一个级别使用。我将 留rollup在子查询中,而不是在外部进行额外的聚合。

于 2012-12-04T03:09:41.853 回答