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)
4

4 に答える 4

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
于 2010-04-09T05:21:42.520 に答える
1

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

編集:

重複行を表示する

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
于 2010-04-09T05:19:47.417 に答える
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
于 2010-04-10T20:24:33.067 に答える
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')
于 2010-04-09T05:33:06.683 に答える