2012-01-19 13 views
3

1000行の非常に大きなテーブル(200+列)があります。私は2行の間に列の違いを表示する必要があります。私はテンポラリテーブルに必要な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

このクエリは、常に2つのレコードを超えていますか? 500レコードがある場合は、決して繰り返されない列、またはおそらく500行のそれぞれに同じでない列を出力したいだけですか? – therealmitchconnors

+0

私は、導入段落の言葉を考えれば、与えられた2つの行の違いだと考えます。 – 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)