2013-08-02 81 views
1

我創建了一個臨時表:它SQL Server的比較兩個表

CREATE table #Temp 
(
    ACCOUNT varchar(20), 
    SERV_ACCT varchar(20), 
    INV_DATE datetime, 
    CURR_Date datetime 
) 

和插入的值。

我叫另一個表:AccountTable其中有四列: ACCOUNT,SERV_ACCT,INV_DATE,CURR_Date

之後我插入值到#TEMP可我這找到所有匹配結果:

SELECT * FROM #Temp 
JOIN AccountTable 
ON #Temp.ACCOUNT = AccountTable.ACCOUNT 
AND #Temp.SERV_ACCT = AccountTable.SERV_ACCT 
AND #Temp.INV_DATE = AccountTable.INV_DATE 
AND #Temp.CURR_Date = AccountTable.CURR_Date 

這是否只返回匹配結果?有另一種方法可以比較嗎?

回答

4

INNER JOIN將只返回匹配的記錄,你可以使用一個FULL JOINWHERE檢查的條件不匹配的記錄:

SELECT * 
FROM #Temp a 
FULL JOIN AccountTable b 
    ON a.ACCOUNT = b.ACCOUNT 
    AND a.SERV_ACCT = b.SERV_ACCT 
    AND a.INV_DATE = b.INV_DATE 
    AND a.CURR_Date = b.CURR_Date 
WHERE a.Account IS NULL 
    OR b.Account IS NULL 

你可以結合起來,與一個CASE語句獲取記錄匹配的細分:

SELECT CASE WHEN a.Account IS NULL THEN 'Record in B Only' 
      WHEN b.Account IS NULL THEN 'Record in A Only' 
      ELSE 'Record in Both' 
     END 
     ,COUNT(*) 'CT'  
FROM #Temp a 
FULL JOIN AccountTable b 
    ON a.ACCOUNT = b.ACCOUNT 
    AND a.SERV_ACCT = b.SERV_ACCT 
    AND a.INV_DATE = b.INV_DATE 
    AND a.CURR_Date = b.CURR_Date 
GROUP BY CASE WHEN a.Account IS NULL THEN 'Record in B Only' 
      WHEN b.Account IS NULL THEN 'Record in A Only' 
      ELSE 'Record in Both' 
     END 
ORDER BY COUNT(*) DESC 

注:上述兩種的假設Account不能合法NULL,挑選不能一個字段10或使用合法地不能全部爲NULL的多個字段。 IE:

WHERE COALESCE(a.ACCOUNT, a.SERV_ACCT,a.INV_DATE,a.CURR_Date) IS NULL 
+0

+1如果OP想要比較不匹配的值,則完全連接和選擇CASE很有意義。 –

2
請問

這僅返回匹配結果?

是的。這將返回匹配結果。

因此,作爲一個例子:

AccountTable:

brian -- bacon -- 02/08/2013 -- 02-08-2013 
chicken -- spam -- 01/08/2013 -- 01-08-2013 

#TEMP:

brian -- bacon -- 02/08/2013 -- 02-08-2013 

你的查詢將返回brian-row

但是考慮一下,如果你的日期不同。那麼僅基於ACCOUNT和SRV_ACC的匹配可能會更合適,因爲您仍然想要顯示這些行。所以這真的取決於上下文的意義,這取決於你。


有另一種方式我能比?

這取決於你想達到什麼。正如Goat CO已經指出的那樣,您還可以顯示不匹配的行。您還可以比較哪些數據較新,或哪些表包含更多數據。如何比較兩件事有很多不同的方法。 例如,通過比較蘋果和西紅柿。有些可能會比較它們的大小,有些可能會比較它們的味道