Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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 select语句中包含子查询的重复行_Sql_Sql Server - Fatal编程技术网

Sql select语句中包含子查询的重复行

Sql select语句中包含子查询的重复行,sql,sql-server,Sql,Sql Server,我正在学习使用SQL Server的数据库,重复操作让我感到困惑: 从teaching te中选择t.tno,t.tname,classes=SELECT COUNT*,其中te.tno=t.tno 来自t老师,教授t2 其中t.tno=t2.tno和t2.language='English' 如果我使用上面的代码,我将得到一个包含许多重复行的结果,如下所示: +------+----------+-------+ |tno |tname |classes| +------+----

我正在学习使用SQL Server的数据库,重复操作让我感到困惑:

从teaching te中选择t.tno,t.tname,classes=SELECT COUNT*,其中te.tno=t.tno 来自t老师,教授t2 其中t.tno=t2.tno和t2.language='English' 如果我使用上面的代码,我将得到一个包含许多重复行的结果,如下所示:

+------+----------+-------+
|tno   |tname     |classes|
+------+----------+-------+
|T01   |t1        |3      |
|T01   |t1        |3      |
|T03   |t3        |4      |
|T03   |t3        |4      |
|T03   |t3        |4      |
|T04   |t4        |3      |
|T05   |t5        |3      |
|T05   |t5        |3      |
+------+----------+-------+
但是,如果不使用子查询,则不会发生重复。有人能帮我吗

更新10/14:教师和教学内部数据:

对于join风格,我老师使用的幻灯片已经过时了,可能是10年前吧?。事实上,代码是几周前编写的,现在我已经习惯了使用内部连接。然而,我仍然对这个问题感到困惑

使用显式联接。只在你学习的时候才离开外部或内部。 除非表强制约束,否则不要使用内部联接。
决不要在select语句中放入下标。在大桌子上,你会压倒整个系统。 group by允许控制唯一行和聚合的定义。 选择t.tno,t.tname,classes=COUNT* 来自t老师 t.tno=t2.tno上的左外连接设定t2 其中t2.Llanguage='English'和t2.tno不为空 按t.tno、t.tname分组
因为老师可以教多个英语课,所以你会得到复本。你给每个老师看英语课的次数

这个查询应该做什么,或者我假设它应该做什么:显示所有至少教过一节英语课的老师的总课堂数。至少教授一门英语课的条件是一个可以在汇总教师行后检查的条件,因此将其放在HAVING子句中

我不知道SQL Server是否真的需要GROUPBY子句中的t.tname。标准SQL没有,因为t.tno应该唯一地定义一个包含他们名字的教师

正如其他人所提到的:如果你被教导使用逗号分隔连接,那么最好退出你的课程、教程或书籍

更新:您已经编辑了您的请求,但似乎仍然对加入的结果感到困惑。要说明联接中发生的情况,请执行以下操作:

老师:

+------+----------+---+----------+--------------------+ |tno |tname |sex|birthday |title | +------+----------+---+----------+--------------------+ |T01 |t1 |m |1980-06-10|lecturer | |T02 |t2 |f |1970-03-14|professor | +------+----------+---+----------+--------------------+ 教学:

+------+------+----------+----+ |tno |cno |Llanguage |Year| +------+------+----------+----+ |T01 |801 |English |2018| |T01 |803 |Bilingual |2018| |T01 |804 |English |2018| |T02 |801 |Bilingual |2018| |T02 |804 |Bilingual |2018| +------+------+----------+----+ 参加英语课程的教师:

+------+----------+------+-----------+--------------------+-------+-------+-------------+--------+ |t.tno |t.tname |t.sex |t.birthday |t.title |t2.tno |t2.cno |t2.Llanguage |t2.Year | +------+----------+------+-----------+--------------------+-------+-------+-------------+--------+ |T01 |t1 |m |1980-06-10 |lecturer |T01 |801 |English |2018 | |T01 |t1 |m |1980-06-10 |lecturer |T01 |804 |English |2018 | +------+----------+------+-----------+--------------------+-------+-------+-------------+--------+ 其中您显示的是前两列加上tno的教学计数:

+------+----------+--------+ |t.tno |t.tname |classes | +------+----------+--------+ |T01 |t1 |3 | |T01 |t1 |3 | +------+----------+--------+
如果您正在学习SQL,请学习正确、明确、标准、可读的联接语法。千万不要在FROM子句中使用逗号。该子查询不会产生额外的行,因此该子查询不会产生额外的行。另外,如果您正在学习SQL,那么为什么要从过时的ANSI-89连接语法开始呢?28年前,它被ANSI-92连接语法所取代。唯一能产生更多行的是对FROM中的表进行隐式连接。SELECT不会影响查询的行数。看起来有几位教师有多行使用多种语言。我们确实需要一些示例数据和预期结果来了解发生了什么。永远不要在SELECT语句中添加下标这意味着什么?什么是子脚本?你是说子查询吗?如果是这样,你的建议是错误的。子查询很好,它们与连接没有什么不同。如果内部联接描述了关系,那么也没有理由不使用它。您可以将子查询放在脚本中的任何位置。但是,在处理大型表时会产生一些影响。因此,如果有500k行,并且您将子查询放在SELECT子句中。子查询将运行500k次。如果你把它放在FROM子句中,它只运行一次。我使用了供应商那样构建的脚本,它们需要一个小时来运行,并将它们调整为20秒。如果你在处理一个小数据库,你是对的,一切都很好。然而,随着时间的推移,你会慢慢减慢你的系统。这在某些情况下可能是正确的,但不是泛化。连接可能必须查找与子查询相同的行名称,只要有正确的索引,SQL Server就能够很好地优化这些内容。在查询设计方面,几乎没有什么硬性规定。你是对的,有时它会造成不必要的负担。:P我也想退出,但这是一门必修课 +------+----------+------+-----------+--------------------+-------+-------+-------------+--------+ |t.tno |t.tname |t.sex |t.birthday |t.title |t2.tno |t2.cno |t2.Llanguage |t2.Year | +------+----------+------+-----------+--------------------+-------+-------+-------------+--------+ |T01 |t1 |m |1980-06-10 |lecturer |T01 |801 |English |2018 | |T01 |t1 |m |1980-06-10 |lecturer |T01 |804 |English |2018 | +------+----------+------+-----------+--------------------+-------+-------+-------------+--------+ +------+----------+--------+ |t.tno |t.tname |classes | +------+----------+--------+ |T01 |t1 |3 | |T01 |t1 |3 | +------+----------+--------+