SQL Server比较两个表

SQL Server比较两个表,sql,sql-server,comparison,Sql,Sql Server,Comparison,我创建了一个临时表: CREATE table #Temp ( ACCOUNT varchar(20), SERV_ACCT varchar(20), INV_DATE datetime, CURR_Date datetime ) 并在其中插入值 我有另一个名为AccountTable的表,它有四列: 账户、服务账户、库存日期、当前日期 在将值插入Temp后,我是否可以执行此操作以查找所有匹配结果: SELECT * FROM #Temp JOIN Accou

我创建了一个临时表:

 CREATE table #Temp
(
    ACCOUNT varchar(20),
    SERV_ACCT varchar(20),
    INV_DATE datetime,
    CURR_Date datetime
)
并在其中插入值

我有另一个名为AccountTable的表,它有四列: 账户、服务账户、库存日期、当前日期

在将值插入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
这会只返回匹配的结果吗?还有别的方法可以比较吗

您的内部联接将只返回匹配的记录,您可以使用完整联接和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
您可以将其与案例陈述相结合,以获得匹配记录的明细:

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
注意:以上两种假设帐户不能合法为空,选择一个不能为空的字段或使用多个不能全部合法为空的字段。 即:

您的内部联接将只返回匹配的记录,您可以使用完整联接和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
您可以将其与案例陈述相结合,以获得匹配记录的明细:

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
注意:以上两种假设帐户不能合法为空,选择一个不能为空的字段或使用多个不能全部合法为空的字段。 即:

这会只返回匹配的结果吗

对。这将返回匹配结果

例如:

表AccountTable:

brian -- bacon -- 02/08/2013 -- 02-08-2013
chicken -- spam -- 01/08/2013 -- 01-08-2013
表温度:

您的查询将返回brian行

但是考虑一下你的日期是否不同。那么,仅基于ACCOUNT和SRV_ACC的匹配可能更合适,因为您仍然希望显示这些行。因此,这实际上取决于上下文,什么是有意义的,这取决于你

还有别的方法可以比较吗

这取决于你想要实现什么。正如GoatCo已经指出的,您还可以显示不匹配的行。您还可以比较哪些数据较新,或者哪些表包含更多数据。有很多不同的方法来比较两件事。 例如,通过比较苹果和番茄。有些人会比较他们的身材,有些人会比较他们的品味

这会只返回匹配的结果吗

对。这将返回匹配结果

例如:

表AccountTable:

brian -- bacon -- 02/08/2013 -- 02-08-2013
chicken -- spam -- 01/08/2013 -- 01-08-2013
表温度:

您的查询将返回brian行

但是考虑一下你的日期是否不同。那么,仅基于ACCOUNT和SRV_ACC的匹配可能更合适,因为您仍然希望显示这些行。因此,这实际上取决于上下文,什么是有意义的,这取决于你

还有别的方法可以比较吗

这取决于你想要实现什么。正如GoatCo已经指出的,您还可以显示不匹配的行。您还可以比较哪些数据较新,或者哪些表包含更多数据。有很多不同的方法来比较两件事。
例如,通过比较苹果和番茄。有些人可能会比较他们的大小,有些人可能会比较他们的品味。

+1完全连接和选择大小写对于OP想要比较不匹配的值很有意义。+1完全连接和选择大小写对于OP想要比较不匹配的值很有意义。