как избежать дублирования при объединении двух таблиц - PullRequest
3 голосов
/ 12 ноября 2011
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, он работает нормально.Почему это происходит?как решить.AM использую DB2 !!

Ответы [ 3 ]

5 голосов
/ 12 ноября 2011

В метках Table есть две строки с 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
4 голосов
/ 12 ноября 2011

Теперь, когда вы уточнили свой вопрос как:

Я хочу найти всех студентов с оценкой 50 по крайней мере по одному предмету. Я бы использовал запрос:

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

Это также дает вам гибкость в изменении критериев, например, по крайней мере, одна оценка 50 или меньше.

1 голос
/ 12 ноября 2011

Аналогично ответу Чарльза, но вы всегда хотите поместить предикат (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...