SQL Server Сравните похожие таблицы с запросом - PullRequest
1 голос
/ 13 сентября 2010

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

Макет БД:

Таблица (* - условие соединения)

Журнал (Неизмененная запись данных.)
- LogID
- RecordID *
- Имя
- Дата
- адрес
- Продукты
- и т. д.

Аудит (запись постобработки)
- CardID *
- CarName
- DeploymentDate
- ShippingAddress
- Опции
- и т. д.

Например, это будет работать , если вы посмотрите на досадную сложность записи и проблемы с производительностью.

Запрос просто объединяет левый и правый и выбирает их в виде строк. Отображение каждого поля соответствует.

select 
  cast(log.RecordID as varchar(40)) + '=' + cast(audit.CardID as varchar(40),
  log.Name+ '=' + audit.Name ,
  cast(log.Date as varchar(40)) + '=' + cast(audit.DeploymentDate as varchar(40), 
  log.Address + '=' + audit.ShippingAddress,
  log.Products+ '=' + audit.Options
  --etc
from Audit audit, Log log
  where audit.CardID=log.RecordId

Что бы вывести что-то вроде:

1 = 1 Test = TestName 11/09/2009 = 11/10/2009 NULL = My Address NULL = Колеса

Это работает, но очень раздражает в сборке. Еще я подумал о том, чтобы просто создать псевдоним столбцов, объединить две таблицы и упорядочить их так, чтобы они были в форме списка. Это позволило бы мне увидеть сравнение столбцов. Это идет с очевидными накладными расходами на объединение всех.

т:

Журнал 1 Test 11/09/2009 null, null
Аудит 1 TestName 10.10.2009 Мой адрес Колеса

Есть ли какие-либо предложения по улучшению аудита этих данных?

Дайте мне знать, какие у вас могут быть другие вопросы.

Дополнительные примечания. Мы хотим уменьшить неважную информацию, чтобы в некоторых случаях мы могли обнулять столбец, если они равны (но я знаю, что он слишком медленный)

  case when log.[Name]<>audit.[CarName] then (log.[Name] + '!=' + audit.[CarName]) else null end

или если мы делаем второй путь

  nullif(log.[Name], audit.[CarName]) as [Name]
  ,nullif(audit.[CarName], log.[Name]) as [Name]

Ответы [ 2 ]

2 голосов
/ 27 сентября 2010

Я нашел подпрограмму, данную здесь Джеффом Смитом, полезной для сравнения таблиц в прошлом.Это может, по крайней мере, дать вам хорошую основу для начала.Код, указанный по этой ссылке:

CREATE PROCEDURE CompareTables(@table1 varchar(100), 
    @table2 Varchar(100), @T1ColumnList varchar(1000),
    @T2ColumnList varchar(1000) = '')
AS

-- Table1, Table2 are the tables or views to compare.
-- T1ColumnList is the list of columns to compare, from table1.
-- Just list them comma-separated, like in a GROUP BY clause.
-- If T2ColumnList is not specified, it is assumed to be the same
-- as T1ColumnList.  Otherwise, list the columns of Table2 in
-- the same order as the columns in table1 that you wish to compare.
--
-- The result is all records from either table that do NOT match
-- the other table, along with which table the record is from.

declare @SQL varchar(8000);

IF @t2ColumnList = '' SET @T2ColumnList = @T1ColumnList

set @SQL = 'SELECT ''' + @table1 + ''' AS TableName, ' + @t1ColumnList +
 ' FROM ' + @Table1 + ' UNION ALL SELECT ''' + @table2 + ''' As TableName, ' +
 @t2ColumnList + ' FROM ' + @Table2

set @SQL = 'SELECT Max(TableName) as TableName, ' + @t1ColumnList +
 ' FROM (' + @SQL + ') A GROUP BY ' + @t1ColumnList + 
 ' HAVING COUNT(*) = 1'

exec ( @SQL)
0 голосов
/ 13 сентября 2010

Хотелось бы что-то вроде этой работы для вас:

select 
  (Case when log.RecordID = audit.CardID THEN 1 else 0) as RecordIdEqual,
  (Case when log.Name = audit.Name THEN 1 else 0) as NamesEqual ,
  (Case when log.Date = audit.DeploymentDate THEN 1 else 0) as DatesEqual, 
  (Case when log.Address = audit.ShippingAddress THEN 1 else 0) as AddressEqual,
  (Case when log.Products = audit.Options THEN 1 else 0) as ProductsEqual
  --etc
from Audit audit, Log log
  where audit.CardID=log.RecordId

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

...