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它工作正常。为什么会这样?如何解决。 AM使用DB2 !!
答案 0 :(得分:5)
标记表中有两行,其中id = 1,mark = 50 ..因此,您将在学生表中的每一行的输出中获得两行... 如果你只想要一个,你必须做一个分组
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
答案 1 :(得分:4)
现在您已将问题澄清为:
我想找到至少一个科目中标记为50的所有学生。我会使用查询:
SELECT student.id, '50'
FROM student
WHERE EXISTS (SELECT 1 FROM marks WHERE marks.id = student.id AND marks.mark = 50)
这也使您可以灵活地更改标准,例如:至少一个50或更小的标记。
答案 2 :(得分: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