Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 这两个片段的区别在哪里?_Sql_Oracle - Fatal编程技术网

Sql 这两个片段的区别在哪里?

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

谢谢你的关注

下面我有两个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(*) 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
    的功能不同。对于您的案例,您可以想象1
    course\u no
    可能有许多不同的
    section\u id
    ,因此,如果您将这两个
    都分组,那么您将得到许多子组,而不是只有1
    course\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 | +-----------+----------+