SQL Server的比较两个表
问题描述:
我创建了一个临时表:它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
这是否只返回匹配结果?有另一种方法可以比较吗?
答
你INNER JOIN
将只返回匹配的记录,你可以使用一个FULL JOIN
和WHERE
检查的条件不匹配的记录:
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
答
请问这仅返回匹配结果?
是的。这将返回匹配结果。
因此,作为一个例子:
表 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已经指出的那样,您还可以显示不匹配的行。您还可以比较哪些数据较新,或哪些表包含更多数据。如何比较两件事有很多不同的方法。 例如,通过比较苹果和西红柿。有些可能会比较它们的大小,有些可能会比较它们的味道
+1如果OP想要比较不匹配的值,则完全连接和选择CASE很有意义。 –