2014-11-03 4 views
0

Я имею следующую структуру таблицы:Как перечислить дубликаты записей?

id|date|studenttypeid|name|audituser 
1|.....|4|Jason|.... 
2|.....|4|Robin|.... 
3|.....|4|Jason|.... 
4|.....|4|Dan|.... 
5|.....|4|Robin|.... 

Мне нужно перечислить все записи, которые дублируют на studenttypeid + name.

С учетом указанных выше данных, запрос должен дать мне следующий вывод:

1|.....|4|Jason|.... 
2|.....|4|Robin|.... 
3|.....|4|Jason|.... 
5|.....|4|Robin|.... 

Как я могу добиться этого на SQL Server 2008?

+0

почему '5 | ..... | 4 | Robin | ....' все еще включены в список? –

ответ

1

Вы можете использовать группу, а затем присоединиться обратно к исходной таблице, как это:

WITH Temp(StudentTypeId, Name) AS(
    SELECT 
     StudentTypeId, Name 
    FROM YourTable 
    GROUP BY 
     StudentTypeId, Name 
    HAVING Count(1) > 1 
) 

SELECT YourTable.* 
FROM YourTable 
INNER JOIN Temp 
    ON YourTable.StudentTypeId = Temp.StudentTypeId 
    AND YourTable.Name = Temp.Name 
0

вы можете использовать ROW_NUMBER()

SELECT ID, DATE, studenttypeid, name, audituser 
FROM 
(
    SELECT ID, DATE, studenttypeid, name, audituser, 
      ROW_NUMBER() OVER (PARTITION BY studenttypeid, name 
           ORDER BY id) rn 
    FROM yourTableName 
) a 
WHERE rn = 1 
0

If вы хотите включить каждое появление дубликатов, еще несколько методов, используя CROSS AP PLY ...

SELECT p.* 
FROM people p 
CROSS APPLY (
    SELECT TOP(1) * FROM people p2 WHERE p2.ID <> p.ID AND p2.name = p.name AND p.studenttypeid = p2.studenttypeid 
) as pWithDups 

Или СУЩЕСТВУЕТ проверить

SELECT p.* 
FROM people p 
WHERE EXISTS (
    SELECT * 
    FROM people p2 
    WHERE p2.ID <> p.ID AND p2.name = p.name AND p.studenttypeid = p2.studenttypeid 
) 
0

Попробуйте

SELECT a.* 
FROM yourtable a 
JOIN (SELECT studenttypeid, 
       name 
     FROM yourtable 
     GROUP BY studenttypeid, 
        name 
     HAVING Count(studenttypeid) > 1) b ON b.name = a.name 
ORDER BY a.id 
Смежные вопросы