Sql 这两个片段的区别在哪里?
谢谢你的关注 下面我有两个sql代码片段,我在Oracle上试过,结果显示了两个不同Sql 这两个片段的区别在哪里?,sql,oracle,Sql,Oracle,谢谢你的关注 下面我有两个sql代码片段,我在Oracle上试过,结果显示了两个不同 select distinct s.course_no, count(*) amt from section s, enrollment e where s.section_id = e.section_id group by s.course_no having count(*) >= 8; select distinct s.course_no, count(*) a
select distinct s.course_no, count(*) amt
from section s, enrollment e
where s.section_id = e.section_id
group by s.course_no
having count(*) >= 8;
select distinct s.course_no, count(*) amt
from section s, enrollment e
where s.section_id = e.section_id
group by s.course_no, e.section_id, s.section_id
having count(*) >= 8;
我得到的结果是,我想根据课程号进行计数,所以我只按s声明组。课程号,为什么章节号会影响查询结果 这两个查询的结果不同
select distinct s.course_no, count(*) amt
from section s, enrollment e
where s.section_id = e.section_id
group by s.course_no
having count(*) >= 8;
因为在上面的查询中,您只在group by中选择了课程号
,所以它正在为不同的课程号
列计算每条记录
但是
在这个查询中,您在select语句中只选择了
课程号
,但在分组依据
中传递了节id
,因此记录是代表课程号
和节id的不同对值计算的,通过分组依据列列表,两个脚本之间存在差异。例如,如果第一个查询返回以下输出-
Course_no Count
A 18
B 10
C 7 -- This row will excluded from output result
-- set as count is lest then 8
对于“分组依据”列列表中的差异,当您在“分组依据”中添加2个新列时,您的结果将不同,如下所示-
Course_no section_id(e) section_id(s) Count
A 1 1 8 -- Show
A 1 2 6 -- Do not show
A 2 1 4 -- Do not show
Total=18
B 1 1 5 -- Do not show
B 1 2 5 -- Do not show
Total=10
C 1 1 4 -- Do not show
C 2 1 3 -- Do not show
Total=7
对于第二个脚本的输出,您将不会在输出中看到列section_id(e)和section_id(s),因为它们不是SELECT的一部分。我只是添加这些列供您参考,以了解结果将如何在内部分发。您将只看到“课程号”和“计数”列
对于count(*)>=8的过滤器,您将只看到一行,因为我将备注放在--Show行之后。由于having子句,所有其他行将从输出中排除。课程号可用于跨节
有部分
+------------+-----------+
| section_id | course_no |
+------------+-----------+
| 1 | 123 | (and 10 enrollments for this section)
| 2 | 123 | (and 10 enrollments for this section)
| 3 | 123 | (and 20 enrollments for this section)
+------------+-----------+
根据经验:
- 我们很少按照
列对进行分组,而这些列不放在SELECT
子句中
我们很少对聚合结果使用DISTINCT
如果你正在做这两件事中的一件,重新考虑一下你为什么要这样做。在第二个查询中,您甚至都在执行这两个操作,这会导致奇怪的结果。显然,它们是不同的,因为它们的groupby
列不同这是因为groupby
的功能不同。对于您的案例,您可以想象1course\u no
可能有许多不同的section\u id
,因此,如果您将这两个都分组,那么您将得到许多子组,而不是只有1course\u no
,还有许多section\u id
。我们不知道您的数据库。一个疗程怎么治疗?123号课程是否总是指同一课程?或者课程号仅在一节中有意义,因此第1节中的课程号123可以引用与第2节中课程号123不同的课程?为什么要使用旧的联接语法?您是否在Oracle 8i或更高版本中工作?或者这些只是您正在处理的旧查询?改为使用ANSI联接:来自s.section\u id=e.section\u id上的节s内部联接注册e
。是什么让你(或其他人)在查询中加入了DISTINCT
?在那里没有任何意义,在我看来,这就像是一场风车大战。
+------------+-----------+
| section_id | course_no |
+------------+-----------+
| 1 | 123 | (and 10 enrollments for this section)
| 2 | 123 | (and 10 enrollments for this section)
| 3 | 123 | (and 20 enrollments for this section)
+------------+-----------+
+-----------+----------+
| course_no | count(*) |
+-----------+----------+
| 123 | 40 |
+-----------+----------+
+-----------+----------+
| course_no | count(*) |
+-----------+----------+
| 123 | 10 | (for section 1)
| 123 | 10 | (for section 2)
| 123 | 20 | (for section 3)
+-----------+----------+
+-----------+----------+
| course_no | count(*) |
+-----------+----------+
| 123 | 10 |
| 123 | 20 |
+-----------+----------+