4
Student Table

 SID    Name
 1      A
 2      B
 3      C

 Marks Table

 id mark    subject 
 1  50  physics
 2  40  biology
 1  50  chemistry
 3  30  mathematics



SELECT distinct(std.id),std.name,m.mark, row_number() over() as rownum FROM 

student std JOIN marks m ON std.id=m.id AND m.mark=50

即使在使用 disticnt 之后,这个结果也是 A 的 2 倍。我的预期结果将只有一个 A。如果我将 row_number() over() 删除为 rownum,它的工作正常。为什么会这样?如何解决。上午使用 DB2!

4

3 回答 3

7

标记表中有两行 id = 1 和标记 = 50.. 所以你会在输出中为学生表中的每一行得到两行...如果你只想要一个,你必须做一个 group By

 SELECT std.id, std.name, m.mark, row_number() 
  over() as rownum 
 FROM student std 
    JOIN marks m 
       ON m.id=std.id AND m.mark=50 
 Group By std.id, std.name, m.mark
于 2011-11-11T20:51:29.887 回答
4

既然您已将问题澄清为:

我想找到至少一门科目成绩为 50 分的所有学生。我会使用查询:

SELECT student.id, '50'
FROM student 
WHERE EXISTS (SELECT 1 FROM marks WHERE marks.id = student.id AND marks.mark = 50)

这也使您可以灵活地更改标准,例如至少一个分数为 50 或更少。

于 2011-11-11T21:08:06.800 回答
1

类似于 Charles 的回答,但您总是希望将谓词 (mark=50) 放在 WHERE 子句中,因此您在加入之前进行过滤。如果这只是家庭作业,那可能并不重要,但如果您遇到任何真实数据,您会想要记住这一点。

SELECT std.sid,
       std.name,
       m.mark,
       row_number() over() AS rownum 
 FROM student std 
      JOIN marks m 
        ON std.sid=m.id
WHERE m.mark=50
GROUP BY std.sid, std.name, m.mark
于 2011-11-11T21:11:00.260 回答