2013-08-02 80 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已经指出的那样,您还可以显示不匹配的行。您还可以比较哪些数据较新,或哪些表包含更多数据。如何比较两件事有很多不同的方法。 例如,通过比较苹果和西红柿。有些可能会比较它们的大小,有些可能会比较它们的味道