2010-04-09 5 views
0

У меня есть следующая таблица:Как выбрать из повторяющихся строк из таблицы?

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) 

ответ

1

Использование SQL Server 2005+ и КТР вы могли бы попробовать

;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

Я хотел бы получить следующим образом: ID COL1 ---- ---- 1 А 1 А 1 B 1 B (4 строки (ы) пострадавших) – RedsDevils

+0

Как насчет (2, B)? –

+0

Все дубликаты строк из таблицы. Извините за мой плохой английский! Пожалуйста, см. Мой комментарий к отвечу Барта. – RedsDevils

4
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 
+0

Я хотел бы показать все повторяющиеся строки в результате. – RedsDevils

+0

Твой третий ответ тоже! Благодаря! – RedsDevils

0

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

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

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

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

например

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

Результат просто для образца: Мы можем добавить следующие 3, C или следующие 2, B/4, C. Я хочу показать все повторяющиеся строки в этой таблице. Извините, я думаю, что мой вопрос недостаточно ясен, чтобы понять всех вас. Извините за мой плохой английский. – RedsDevils

0
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 
Смежные вопросы