2012-01-19 8 views
3

У меня очень большая таблица (200+ столбцов) с 1000 строк. Мне нужно отображать различия в столбцах между двумя строками. Я могу загрузить 2 строки, которые мне нужны, в временную таблицу, но я не уверен, как исходить оттуда.SQL Server: отображение различий в столбцах между двумя строками

Например (я буду использовать только 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+) Столбцы» У вас есть очень большая проблема;) http://en.wikipedia.org/wiki/Database_normalization –

+1

будет ли этот запрос всегда иметь только две записи? Если есть 500 записей, вы хотите только вывести столбцы, которые никогда не повторяются, или, возможно, столбцы, которые не совпадают в каждой из 500 строк? – therealmitchconnors

+0

Я предполагаю, что это различия между двумя заданными строками, учитывая формулировку вступительного параграфа. – marnir

ответ

0

Вам нужно сделать некоторые динамические SQL, который будет цикл по мета-данных при помощи временной таблицы и будет проверять, есть ли необходимость в верните данный столбец. В итоге, динамически создайте оператор SELECT, который вернет ключ (вы можете сделать это жестко для этой ситуации, или вы можете сделать его параметром, если вы поместите эту логику в более общую хранимую процедуру).

Быстрый & грязное это будет выглядеть примерно так:

-- 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) 
Смежные вопросы