SQL选择语句
我认为这是一个非常基本的问题,我已经在网站上搜索过了,但我不确定要搜索什么才能找到答案 我有一个SQL表,看起来像:SQL选择语句,sql,mysql,Sql,Mysql,我认为这是一个非常基本的问题,我已经在网站上搜索过了,但我不确定要搜索什么才能找到答案 我有一个SQL表,看起来像: studentId period class 1 1 math 1 2 english 2 1 math 2 2 history 我正在寻找一个SELECT语句,它可以找到正在上数学第一节课和英语第二节课的学生ID。我尝试过类似于选择stu
studentId period class
1 1 math
1 2 english
2 1 math
2 2 history
我正在寻找一个SELECT语句,它可以找到正在上数学第一节课和英语第二节课的学生ID。我尝试过类似于选择studentID WHERE(period=1和class=“math”)和(period=2和class=“english”)
的方法,但没有成功
我还考虑将我的桌子改为:
studentId period1 period2 period3 period4 period5 etc
但我想除了课后活动之外,我还想添加一些东西,并且希望能够轻松地扩展,而不必不断地添加专栏
谢谢你能给我的任何帮助。试试以下方法:
select studentid from table where ( period = 1 AND class= "math" ) or ( period = 2 AND class =
"english" ) group by studentid having count(*) >= 2
其思想是选择所有符合第一个条件或第二个条件的人,按人分组,并通过检查分组的行数来查看在哪里符合所有条件。您可以使用子查询单独执行每个查询,并仅在两个子查询匹配的情况下获得结果
Select StudentId FROM table WHERE
StudentId IN
(SELECT studentID FROM table WHERE ( period = 1 AND class= "math" ) )
AND
StudentId IN
(SELECT studentID FROM table WHERE ( period = 2 AND class= "english" ) )
编辑-添加
我自己并没有测试过这个,但我对性能方面的考虑很好奇,所以我查了一下。我发现这句话:
许多Transact-SQL语句
包含子查询可以是
交替地表示为连接。
其他问题只能通过以下方式提出:
子查询。在Transact-SQL中,有
通常没有性能差异
在包含
子查询与语义等价
不存在的版本。然而,在
某些情况下,存在必须
如果选中,则联接会产生更好的结果
演出否则,嵌套的
必须为每个查询处理查询
外部查询的结果以确保
消除重复。这样
在这种情况下,连接方法将产生
更好的结果。下面是一个例子
显示子查询和选择的示例
和一个返回相同值的联接选择
结果集:
此处:您还可以进行自连接
SELECT t1.studentID
FROM table t1
JOIN table t2 ON t1.studentID = t2.studentID
WHERE ( t1.period = 1 AND t1.class= "math" )
AND ( t2.period = 2 AND t2.class = "english" )
没错,但有点过分了,不是吗D但+1用于提供正确的子查询示例不需要有两个子查询,但是-一个子查询可以合并到顶级查询中。@Joe Hopfgartner:他想要的是INTERSECT,David的方法是intersect.true@margin的标准公式,但我喜欢这个答案,因为它非常清楚地展示了一种不同的方法,并且子查询实际上无论如何都不是选择的武器!但是理解不同的可能性是很重要的,因此最好将它们尽可能地简单化。@Joe Hopfgartner,这可能有些过分,如果性能成为一个问题,就不应该使用它,但为了代码的清晰性,我认为它非常好。你的回答也很好,但就我个人而言,如果我是一名维护程序员,需要对其进行调整,我必须考虑一下。然而,我确实投票支持你,因为它肯定会奏效。在找到那篇文章后,我打算把它作为第二种可能性加入我的答案中,但你抢先了我一步。美好的