2014-10-23 3 views
1

У меня есть район, Техсила, школы код и школы Имя в следующей схеме:Проверка Дублирования из данных Повторяющихся

District Tehsil SchCode  SchName 
A   AA 11111111  AA1 
A   AA 11111111  AA2 
A   AA 11111111  AA3 
B   BB 22222222  BB1 
B   BB 22222222  BB2 
B   BB 22222222  BB3 

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

Для этого запросите SQL Server Query. Я использую SQL Server 2008 Exp

ответ

1

Вы можете присоединиться к коррелированных подзапросов, что группы по этому столбцу:

SELECT t1.District, t1.Tehsil, t1.SchCode, t1.SchName 
FROM dbo.TableName t1 
INNER JOIN (SELECT SchCode 
      FROM dbo.TableName 
      GROUP BY SchCode HAVING COUNT(*) > 1) dup 
ON t1.SchCode = dup.SchCode 

Sql-fiddle, который возвращает все строки, потому что все являются дубликатами другого.

Если вместо этого вы просто хотите знать, если запись имеет дубликат вы могли бы использовать этот запрос:

SELECT t1.District, t1.Tehsil, t1.SchCode, t1.SchName, 
     hasDuplicate = CASE WHEN dup.SchCode IS NULL THEN 'no' ELSE 'yes' END 
FROM dbo.TableName t1 
LEFT OUTER JOIN (SELECT SchCode 
       FROM dbo.TableName 
       GROUP BY SchCode HAVING COUNT(*) > 1) dup 
ON t1.SchCode = dup.SchCode 

Sql-fiddle с измененными данными, чтобы получить не-дубликат.

+0

Tim возвращает все строки, я хочу список SchCode который появился более чем один раз для различных или же школ, я уверен, что вы ¨R получать мой точка. –

+0

@ShahNawaz: почему вы указываете, что дубликат должен иметь «другую или ту же школу»? С тех пор это не имеет никакого смысла, этот столбец не имеет значения, или есть третий вариант помимо _different_ и _same_. –

0

попробовать это

;WITH cte AS 
(SELECT Row_number() OVER (partition BY schcode ORDER BY schname) id,* 
FROM  tablename) 
SELECT * 
FROM tablename a 
JOIN (SELECT id,schcode ,count(1) 
     FROM  cte 
     GROUP BY id,schcode 
     HAVING Count(1) > 1)) B 
ON  a.schcode = b.schcode 

или

SELECT * 
FROM tablename a 
JOIN (SELECT schname,schcode ,count(1) 
     FROM  tablename 
     GROUP BY schname,schcode 
     HAVING Count(1) > 1)) B 
ON  a.schcode = b.schcode 
Смежные вопросы