使用以下查询时:
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
我希望它只返回尚未使用C
和CC
组合的行。我是否误解了group by
的工作原理?我将如何实现这一结果?
我想让它回归:
C | S | CC | SS
----|----|----|----
1 | 1 | 2 | 1
1 | 1 | 3 | 1
1 | 1 | 5 | 1
我使用Oracle SQLPlus
。
答案 0 :(得分:1)
您正在对taughtin.c_code
和ti.c_code
的组合进行分组,这些组合是查询上下文中的单独列(即使它们是架构中的相同列)。一对1, 2
与一对2, 1
不同;值可能相同,但来源不是。
如果你想以一种方式而不是另一种方式获得组合,那么最简单的方法是始终使一个值大于另一个;而不是:
where taughtin.c_code <> ti.c_code
使用:
where ti.c_code > taughtin.c_code
虽然对主查询使用ANSI连接也会更好,但我不喜欢自然连接。您也不需要distinct
;第一个可以消除重复但如果你只使用in()
的临时结果集,它们在逻辑上不重要