2010-09-13 83 views
1

簡單的概念我們基本上是在做一些審計,比較進入的內容以及處理過程中實際發生的情況。我正在尋找一種更好的方式來執行查詢,該查詢可以與名稱和潛在類型略有不同的列進行並排表比較。SQL Server將類似的表格與查詢進行比較

DB佈局:

表(*爲連接條件)

登錄(未經修改的數據記錄。)
- LOGID
- 的recordId *
- 名稱
- 日期
- 地址
- 產品
- 等

審計(後處理記錄)
- CardId中*
- CarName
- DeploymentDate
- ShippingAddress
- 選項
- 等

對於例如這個工作,如果你看過去惱人的比較lexity編寫和性能問題。

該查詢只是加入左側和右側,並選擇它們作爲字符串。顯示每個匹配的字段。

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測試=測試名11月9日/ 2009 = 11/10/2009空=我的地址空=輪

這工程,但非常討厭建立。我想到的另一件事就是別名列,聯合兩個表,並命令他們,所以他們將列表形式。這可以讓我看到列的比較。這伴隨着所有聯盟的明顯開銷。

即:

日誌1個測試11/09/2009 NULL,NULL
審計1測試名11/10/2009我的地址車輪

上更好的方法來審覈任何建議這個數據?

讓我知道你可能有什麼其他問題。

其他注意事項。我們將要減少不重要的信息,所以在某些情況下,如果他們是平等的,我們可能NULL列(但我知道它的速度太慢)

​​

,或者如果我們正在做的第二種方式

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

你是什麼意思的更好的方法?您是否在尋找更好的方式來顯示數據,以便更清楚地閱讀它?你想限制數據只有那些有差異? – 2010-09-13 16:01:07

+0

在性能和可讀性方面更好。我們正在做一些分析這些數據的工作,所以我們會根據需要進行過濾,但我們也可能會像上面那樣做一些事情。如果某些列相同,我們可能會將它們清空,以便我們可以更快地篩選結果集。 – Nix 2010-09-13 16:07:14

+0

你想達到什麼目的?請提供更多信息。 – 2010-09-13 18:09:15

回答

2

我發現傑夫史密斯給出的例程here有助於做表比較過去。這至少可以爲你提供一個很好的基礎。在該鏈接上給出的代碼是:

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

將這樣的事情對你的工作:

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 

這會給你休息的基礎上,列名什麼是平等下來。似乎這可能比做所有的演員,並不得不解釋所產生的字符串更容易...

+0

我這樣做是因爲如果記錄相同,我們可能需要知道列的值。假設列A是正確的(並且是唯一標識符),並且B不正確,我們需要查看A的值。但是,我可能會使用此策略過濾出不那麼重要的值。 – Nix 2010-09-14 11:56:52