db2 如何在联接两个表时避免重复

jw5wzhpr  于 2022-11-07  发布在  DB2
关注(0)|答案(3)|浏览(158)
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

这个结果是2倍的A,即使使用disticnt。我的预期结果将只有一个A。如果我删除row_number()over()作为rownum,它的工作正常。为什么会发生这种情况?如何使用DB2解析. AM!!

omtl5h9j

omtl5h9j1#

marks表中有两行,id = 1,mark = 50..因此,对于student表中的每一行,您将在输出中获得两行...如果您只需要一行,则必须执行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
3j86kqsm

3j86kqsm2#

现在,您已将问题澄清为:
我想找出至少有一门科目得分为50分的所有学生。我将使用以下查询:

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

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

wdebmtf2

wdebmtf23#

类似于Charles的答案,但您总是希望将 predicate (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

相关问题