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を使用した後でも2倍のAです。私の期待する結果はAが1つだけです。row_number()over()をrownumとして削除すると、正常に機能します。なぜこれが起こっているのですか?解決する方法。DB2を使用しているAM!!

4

3 に答える 3

7

マークテーブルにはid=1とマーク=50の2つの行があります。したがって、学生テーブルの各行の出力に2つの行があります... 1つだけが必要な場合は、グループ化を行う必要があります。

 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

これで、質問が次のように明確になりました。

少なくとも1つの科目で50点のすべての学生を見つけたいと思います。私はクエリを使用します:

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

これにより、基準を柔軟に変更することもできます。たとえば、50以下のマークが少なくとも1つあります。

于 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 に答える