为什么不返回这些属性的唯一组合?

时间:2015-11-08 18:26:59

标签: sql oracle group-by distinct

使用以下查询时:

with neededSkills(SkillCode) as (
    select distinct SkillCode
    from job natural join hasprofile natural join requires_skill
    where job_code = '1'
    minus
    select skillcode
    from person natural join hasskill
    where id = '1'
)
select distinct
  taughtin.c_code as c,
  count(taughtin.skillcode) as s,
  ti.c_code as cc,
  count(ti.skillcode) as ss
 from taughtin, taughtin ti
where taughtin.c_code <> ti.c_code
  and taughtin.skillcode <> ti.skillcode
  and taughtin.skillcode in (select skillcode from neededskills)
  and ti.skillcode in (select skillcode from neededskills)
group by (taughtin.c_code, ti.c_code)
order by (taughtin.c_code);

它返回:

 C  | S  | CC | SS
----|----|----|----
 1  | 1  | 2  | 1
 1  | 1  | 3  | 1
 1  | 1  | 5  | 1
 2  | 1  | 1  | 1
 3  | 1  | 1  | 1
 5  | 1  | 1  | 1

我希望它只返回尚未使用CCC组合的行。我是否误解了group by的工作原理?我将如何实现这一结果?

我想让它回归:

 C  | S  | CC | SS
----|----|----|----
 1  | 1  | 2  | 1
 1  | 1  | 3  | 1
 1  | 1  | 5  | 1

我使用Oracle SQLPlus

1 个答案:

答案 0 :(得分:1)

您正在对taughtin.c_codeti.c_code的组合进行分组,这些组合是查询上下文中的单独列(即使它们是架构中的相同列)。一对1, 2与一对2, 1不同;值可能相同,但来源不是。

如果你想以一种方式而不是另一种方式获得组合,那么最简单的方法是始终使一个值大于另一个;而不是:

where taughtin.c_code <> ti.c_code

使用:

where ti.c_code > taughtin.c_code

虽然对主查询使用ANSI连接也会更好,但我不喜欢自然连接。您也不需要distinct;第一个可以消除重复但如果你只使用in()的临时结果集,它们在逻辑上不重要