2012-01-19 6 views
3

1000 개의 행이 포함 된 매우 큰 테이블 (200+ 열)이 있습니다. 두 행 사이의 열에 차이점을 표시해야합니다. 임시 테이블에 필요한 2 행을로드 할 수 있지만 거기에서 진행하는 방법을 모르겠습니다. 예를 들어SQL Server : 2 행 사이의 열에 차이 표시

(나는 단지 여기에 5 개 행을 사용하여 단지 일반적인 이름을 사용하는 것)이이 사이의 유일한 차이가로

ID  | GName  | SName | Add1   | Add2 
360111 | Billy  | Bob  | 1 Happy St | Sydney 
360111 | Billy  | Bob  | 6 Sunny St | Melbourne 

내가 표시 할 것은

Add1  | Add2 
1 Happy St | Sydney 
6 Sunny St | Melbourne 

입니다 2 행. 다른 시간이 더 차이가 없다, 또는 여러

건배

+3

"나는이 매우 큰 테이블 (200 + 열)"당신은 매우 큰 문제가있다 : 그것은 다음과 같이 보일 것이다

빠른 & 더러운/wiki/Database_normalization –

+1

이 쿼리는 항상 두 레코드 이상입니까? 500 개의 레코드가있는 경우 반복되지 않는 열만 또는 500 행마다 동일하지 않은 열만 출력하고 싶습니까? – therealmitchconnors

+0

소개 단락의 문구가 주어지면 주어진 두 행 사이의 차이점이라고 생각합니다. – marnir

답변

0

어떤 필요성이있는 경우 당신은 임시 테이블의 메타 데이터를 통해 루프를 확인합니다 몇 가지 동적 SQL을 확인해야합니다 지정된 열을 리턴합니다. 결국, 동적으로 키를 반환하는 SELECT 문을 생성합니다 (이 상황을 위해이 코드를 하드 코딩하거나보다 일반적인 저장 프로 시저에이 논리를 넣으면 매개 변수로 만들 수 있습니다).) http://en.wikipedia.org;

-- setting up test-data 
IF OBJECT_ID('tempdb..#test') IS NOT NULL DROP TABLE #test 

SELECT ID  = 360111, 
     GName = 'Billy',   
     SName = 'Bob',  
     Add1 = '1 Happy St', 
     Add2 = 'Sydney' 
INTO #test 

UNION ALL 

SELECT ID  = 360111, 
     GName = 'Billy',  
     SName = 'Bob',  
     Add1 = '6 Sunny St', 
     Add2 = 'Melbourne' 


GO 
-- find different columns and list them 
DECLARE @c_column_name sysname 
DECLARE @sql nvarchar(max) 

IF OBJECT_ID('tempdb..#diff_columns') IS NOT NULL DROP TABLE #diff_columns 

SELECT column_name = name 
    INTO #diff_columns 
    FROM sys.columns 
WHERE 1 = 2 

DECLARE column_loop CURSOR LOCAL FAST_FORWARD 
    FOR SELECT diff_columns = name 
      FROM tempdb.sys.columns 
     WHERE object_id = object_id('tempdb..#test') 
      AND name <> 'ID' -- no need to test the key-field 
OPEN column_loop 
FETCH NEXT FROM column_loop INTO @c_column_name 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SELECT @sql = 'INSERT #diff_columns (column_name) 
         SELECT ''' + @c_column_name + ''' 
         WHERE EXISTS (SELECT * FROM #test HAVING COUNT (DISTINCT ' + @c_column_name + ') > 1)' 

     EXEC (@sql)       

     FETCH NEXT FROM column_loop INTO @c_column_name 
    END 
CLOSE column_loop 
DEALLOCATE column_loop 

SELECT @sql = 'SELECT ID' 
SELECT @sql = @sql + ', ' + column_name 
    FROM #diff_columns 
SELECT @sql = @sql + ' FROM #test' 

EXEC (@sql)