从多个表中显示数据的SQL查询

4

我在Stack Overflow上搜索了这个问题,但是没有找到正确的答案。

Student
------------------
rollno int PK
name   varchar(20)
class  varchar(20)

另一张表格为:
Marks
-----------------
rollno FK
sub1   int
sub2   int
sub3   int
sub4   int
sub5   int

sub1sub2等包含科目的分数。现在我想要一个查询,它将显示在超过2个科目中得到了>35分的学生信息?


欢迎来到StackOverflow!请尽快正确格式化您的问题。您说您之前在SO上搜索过,所以您应该知道正确的格式是什么样子的。此外,请提供示例数据、期望的输出以及您当前查询的版本。 - peterm
你正在使用SQL Server吗? - Mudassir Hasan
请再次提供样本数据,以说明您所说的“在两门以上科目中获得超过35分”的含义。另外,请问您使用的是哪种关系型数据库管理系统(如SQL Server、MySQL、Oracle等)? - peterm
6个回答

2
select rollno, 
 case when sub1 < 35  then 0 else 1 end +
 case when sub2 < 35  then 0 else 1 end +
 case when sub3 < 35  then 0 else 1 end +
 case when sub4 < 35  then 0 else 1 end +
 case when sub5 < 35  then 0 else 1 end +
 end 
 as [Count]
from student,marks where count > 2

1
你可以使用CASE WHEN语句,并对字段进行求和,筛选出大于35的值。
SELECT s.rollno, s.name, s.class
FROM Student s join Marks m on (s.rollno = m.rollno)
where (CASE WHEN sub1>35 THEN 1 ELSE 0 END +
   CASE WHEN sub2>35 THEN 1 ELSE 0 END +
   CASE WHEN sub3>35 THEN 1 ELSE 0 END +
   CASE WHEN sub4>35 THEN 1 ELSE 0 END +
   CASE WHEN sub5>35 THEN 1 ELSE 0 END) > 2;

你可以从这里检查 SQL Fiddle..

0
DECLARE @tempRollnoTable(rno int)

INSERT INTO @tempRollnoTable
SELECT rollno FROM marks
WHERE sub1 > 35

UNION ALL

SELECT rollno FROM marks
WHERE sub2 > 35

UNION ALL

SELECT rollno FROM marks
WHERE sub3 > 35

UNION ALL

SELECT rollno FROM marks
WHERE sub4 > 35

UNION ALL

SELECT rollno FROM marks
WHERE sub5 > 35



SELECT * FROM student
WHERE rollno IN ( SELECT rno FROM @tempRollnoTable 
                  GROUP BY rno HAVING COUNT(*) > 2 )

0

试试这个

 select student.* from student inner join marks on student.rollno= marks.rollno 
     where marks.rollno in(
      Select a.* from (
        Select RollNo from marks where sub1>35
        Union ALL
        Select RollNo from marks where sub2>35
        Union ALL
        Select RollNo from marks where sub3>35
        Union ALL
        Select RollNo from marks where sub4>35
        Union ALL
        Select RollNo from marks where sub5>35) a 
       having(rollno)>1)

0

你的成绩表可以先进行规范化!

Marks
-----------------
rollno       int
Subject_ID   int --( FK )
Subject_Val  int

Subjects
-----------------
ID             int
Subject_Name   varcahar(20)

在你做了这个小改变之后,事情会变得更加清晰。


-1

我也是编程新手,但你可以尝试类似这样的代码,不过一定要先把问题搞清楚。

SELECT student.* from student InnerJoin marks ON studnet.roll_no=marks.student) where (sub1>=35 && sub2>=35 and so on)

语法不正确,即使您考虑所有科目都大于35分,这也不是事实。 - Shiva Komuravelly
谢谢,我刚才误解了问题。 - Desire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接