1

我创建了一个临时表:

 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

2 回答 2

4

INNER JOIN只会返回匹配的记录,您可以使用FULL JOINandWHERE条件来检查不匹配的记录:

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合法的字段。IE:

WHERE COALESCE(a.ACCOUNT, a.SERV_ACCT,a.INV_DATE,a.CURR_Date) IS NULL
于 2013-08-02T16:45:22.290 回答
2

这会只返回匹配的结果吗?

是的。这将返回匹配结果。

举个例子:

帐户表:

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 已经指出的那样,您还可以显示不匹配的行。您还可以比较哪些数据较新,或者哪个表包含更多数据。有许多不同的方法可以比较两个事物。例如,通过比较苹果和西红柿。有些人可能会比较他们的大小,有些人可能会比较他们的口味。

于 2013-08-02T17:00:51.973 回答