Как выбрать из повторяющихся строк в таблице? - PullRequest
0 голосов
/ 09 апреля 2010

У меня есть следующая таблица:

CREATE TABLE TEST(ID TINYINT NULL, COL1 CHAR(1))
INSERT INTO TEST(ID,COL1) VALUES (1,'A')
INSERT INTO TEST(ID,COL1) VALUES (2,'B')
INSERT INTO TEST(ID,COL1) VALUES (1,'A')
INSERT INTO TEST(ID,COL1) VALUES (1,'B')

INSERT INTO TEST(ID,COL1) VALUES (1,'B')
INSERT INTO TEST(ID,COL1) VALUES (2,'B')

Я хотел бы выбрать повторяющиеся строки из этой таблицы. Как я могу их выбрать?

Я попробовал следующее:

SELECT TEST.ID,TEST.COL1
FROM TEST WHERE TEST.ID IN
(SELECT ID
FROM TEST WHERE TEST.COL1 IN
(SELECT COL1
FROM TEST WHERE TEST.ID IN
(SELECT ID
FROM TEST
GROUP BY ID
HAVING COUNT(*) > 1)
GROUP BY COL1
HAVING COUNT(*) > 1)
GROUP BY ID
HAVING COUNT(*) > 1)

Где ошибка? Что мне нужно изменить?

И я хотел бы, чтобы это отображалось как:

ID   COL1
---- ----
1    A
1    A
1    B
1    B

(4 row(s) affected)

Ответы [ 4 ]

4 голосов
/ 09 апреля 2010
SELECT id, col1
FROM Test
GROUP BY id, col1
HAVING COUNT(*) > 1

при использовании

SELECT id, col1, COUNT(*) AS cnt
FROM Test
GROUP BY id, col1
HAVING COUNT(*) > 1

у вас есть практически все повторяющиеся строки и как часто они появляются. Вы не можете идентифицировать их индивидуально в любом случае.

Более медленный путь:

SELECT id, col1
FROM Test T
WHERE (SELECT COUNT(*)
       FROM Test I
       WHERE I.id = T.id AND I.col1 = T.col1) > 1
1 голос
/ 09 апреля 2010

Используя Sql Server 2005+ и CTE, вы можете попробовать

;WITH Dups AS (
    SELECT *,
            ROW_NUMBER() OVER(PARTITION BY ID, Col1 ORDER BY ID, Col1) Rnum
    FROM @TEST t
)
SELECT *
FROM Dups
WHERE Rnum > 1

ИЛИ просто стандарт

SELECT  ID, 
        Col1,
        COUNT(1) Cnt
FROM    @TEST
GROUP BY    ID, 
            Col1
HAVING  COUNT(1) > 1

EDIT:

Показать дубликаты строк

SELECT  t.*
FROM    @Test t INNER JOIN
        (
            SELECT  ID,  
                    Col1, 
                    COUNT(1) Cnt 
            FROM    @TEST 
            GROUP BY    ID,  
                        Col1 
            HAVING  COUNT(1) > 1 
        ) dups  ON  t.ID = dups.ID 
                AND t.Col1 = dups.Col1
0 голосов
/ 11 апреля 2010
SELECT t.* 
FROM TEST t
           INNER JOIN (
                       SELECT ID,COL1 
                       from test 
                       GROUP BY ID,COL1
                       HAVING COUNT(*) > 1
                      ) 
                       AS t2 
                       ON t2.ID = t.ID AND t2.COL1 =t.COL1
order by t.ID,t.COL1
0 голосов
/ 09 апреля 2010

Каждая строка в этом наборе данных является дубликатом

select id, col1, count(*)
from test
group by id, col1

показывает это

если вы хотите исключить строки 2, B, вам нужно сделать это явно

например

SELECT id, col1
FROM Test
WHERE NOT (id = 2 and col1 = 'B')
...