【问题标题】:SQL Server Comparing two tablesSQL Server 比较两个表
【发布时间】:2013-08-02 16:43:59
【问题描述】:

我创建了一个临时表:

 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

这会只返回匹配的结果吗?还有其他方法可以比较吗?

【问题讨论】:

    标签: sql sql-server comparison


    【解决方案1】:

    您的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,选择一个不能是NULL 的字段,或者使用多个不能都合法地是NULL 的字段。 即:

    WHERE COALESCE(a.ACCOUNT, a.SERV_ACCT,a.INV_DATE,a.CURR_Date) IS NULL
    

    【讨论】:

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

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 2017-11-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多