2013-02-20 4 views
1

Я в ситуации, когда мне нужно выбрать строки, которые имеют одинаковый контент в двух конкретных столбцах, и отдельный контент в третьем. До сих пор я получил это для двух аналогичных столбцов:Поиск дубликатов с двумя аналогичными столбцами и одним отличным

SELECT id, Title, 
COUNT(*) AS NumOccurrences 
FROM Table 
GROUP BY id, Title 
HAVING (COUNT(*) > 1) 

Теперь я должен указать третий отдельный столбец в этом запросе. Назовем это Ральфом. Это, очевидно, не работает:

SELECT id, Title, DISTINCT Ralph, 
COUNT(*) AS NumOccurrences 
FROM Table 
GROUP BY id, Title 
HAVING (COUNT(*) > 1) 

И что будет?

+0

Что SQL Sever версии вы используете? – Arion

+0

К сожалению, SQL Server 2008 – SylvainB

ответ

0
select * from (
    SELECT id, Title, COUNT(*) AS NumOccurrences 
    FROM Table t 
    GROUP BY id, Title 
    HAVING (COUNT(*) > 1) 
) t 
cross apply (
    select distinct Ralph 
    from Table 
    where id = t.id and Title = t.Title 
) t2 
+0

Благодарим за помощь! Но, к сожалению, «Подзапрос вернул более 1 значения. Это недопустимо, когда подзапрос следует за =,! =, <, <= , >,> = или когда подзапрос используется как выражение». – SylvainB

+0

Может быть, я должен указать, что это не уникальный идентификатор, это чужой идентификатор – SylvainB

+0

ОК, я вижу. Попробуйте обновить ответ. – muhmud

0

Вы можете использовать COUNT (*) с OVER() п

;WITH cte AS 
(  
    SELECT id, Title, Ralph, COUNT(*) OVER (PARTITION BY id, Title) AS cnt 
    FROM dbo.test11 
    GROUP BY id, Title, Ralph 
) 
    SELECT * 
    FROM cte 
    WHERE cnt > 1 

Демо на SQLFiddle

Смежные вопросы