2015-09-30 2 views
3

У меня есть следующая таблица с двумя столбцами, как показано ниже:SQL Server 2008 R2: удалить запись о единичном входе.

CREATE TABLE test_lin 
(
    Cola INT, 
    Colb INT 
); 

INSERT INTO test_lin VALUES(1,2); 
INSERT INTO test_lin VALUES(1,3); 
INSERT INTO test_lin VALUES(1,4); 
INSERT INTO test_lin VALUES(1,5); 
INSERT INTO test_lin VALUES(1,3); 
INSERT INTO test_lin VALUES(2,4); 
INSERT INTO test_lin VALUES(2,6); 
INSERT INTO test_lin VALUES(2,7); 
INSERT INTO test_lin VALUES(2,4); 
INSERT INTO test_lin VALUES(2,6); 

Примечание: Теперь я хочу, чтобы показать только те записи, которые повторяются более чем один раз. Как и в моем случае (1,3),(2,4),(2,6) записи повторяются в таблице.

enter image description here

Я хочу, чтобы удалить однократная записей из результирующего набора. Записи, которые являются одиночными, показаны на рисунке ниже.

enter image description here

ответ

1
WITH CTE as 
(
SELECT Cola,Colb,ROW_NUMBER() OVER(PARTITION BY Cola,Colb ORDER BY Cola) AS RN 
FROM test_lin 
) 

SELECT T.* 
FROM test_lin T INNER JOIN CTE C ON C.COLa = t.Cola and C.COLb = t.Colb and c.RN=2 
1

Попробуйте это:

WITH cte AS 
(SELECT cola, colb 
    FROM test_lin 
    GROUP BY cola, colb 
    HAVING count(*) > 1) 
    SELECT l.* 
    from test_lin l INNER JOIN CTE ON 
     l.cola = cte.cola and l.colb=cte.colb 
+0

Я хочу также показать повторяющиеся записи. Это возможно? – MAK

+0

Не знал, что вам нужна вся запись. Ответ на Dark Knight, очевидно, принят, но эта версия будет работать и на вас. – BICube

+0

Необходимо удалить 'DISTINCT' из внешнего оператора SELECT, тогда результатом будет ожидаемый результат. Что ж! Огромное спасибо. Будьте уверены, за ваши усилия. – MAK

0

Проверить этот пример, я взят из образца @Ala и добавляя что-то:

1) Первый вариант

select * from 
(
SELECT * 
    FROM test_lin 
    GROUP BY cola, colb 
    HAVING count(*) > 1 
) cte 
join test_lin l ON 
l.cola = cte.cola and l.colb=cte.colb 

2) исправление в @Ala ответ.

;WITH cte AS 
(SELECT cola, colb 
    FROM test_lin 
    GROUP BY cola, colb 
    HAVING count(*) > 1) 
    SELECT l.* --remove distinct only 
    from test_lin l INNER JOIN CTE ON 
     l.cola = cte.cola and l.colb=cte.colb 
+0

Повторите проверку своего сценария. – MAK