我创建了一个临时表:
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
这会仅返回匹配的结果吗?还有其他方法可以比较吗?
答案 0 :(得分:4)
您的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
,选择一个不能NULL
的字段或使用多个不能全部NULL
的字段{1}}合法地。
IE:
WHERE COALESCE(a.ACCOUNT, a.SERV_ACCT,a.INV_DATE,a.CURR_Date) IS NULL
答案 1 :(得分: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已经指出的那样,您还可以显示不匹配的行。您还可以比较哪些数据更新,哪些表包含更多数据。如何比较两件事有很多不同的方法。 例如,通过比较苹果和西红柿。有些人可能会比较他们的大小,有些人可能会比较他们的口味。