如何避免重复加入两个表

时间:2011-11-11 20:46:03

标签: sql join db2 row-number

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 !!

3 个答案:

答案 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