如何在MSSQL中找到两个表之间的差异

时间:2018-06-04 09:12:30

标签: sql-server

我有两张桌子'顾客'。

第一个:

ID | UserID | Date 
1. |   1    | 2018-05-01
2. |   1    | 2018-05-02

第二个:

ID | UserID | Date 
1. |   1    | 2018-05-01
2. |   1    | 2018-05-02
3. |   1    | 2018-05-03

因此,正如您在第二个表中看到的那样,还有一行。 到目前为止,我已经写了这段代码:

;with cte_table1 as (
select UserID, count(id) cnt from db1.Customer group by UserID
),
cte_table2 as (
select UserID, count(id) cnt from db2.Customer group by UserID
)
select * from cte_table1 t1
join cte_table2 t2 on t2.UserID = t1.UserID
where t1.cnt <> t2.cnt

这给了我预期的结果:

UserID | cnt | UserID | cnt
   1   |  2  |   1    |  3   

到目前为止,一切都很好。问题是,这两个表有很多行,我希望结果有日期,其中cnt不匹配。

换句话说,我想有这样的事情:

    UserID | cnt |     Date    | UserID | cnt |    Date
       1   |  2  | 2018-05-01  |  1     |  3  | 2018-05-01
       1   |  2  | 2018-05-02  |  1     |  3  | 2018-05-01
       1   |  2  |    NULL     |  1     |  3  | 2018-05-03

最好的结果是结果集,其中两个cte都加入了这个:

    UserID | cnt |     Date    | UserID | cnt |    Date
       1   |  2  | 2018-05-01  |  1     |  3  | 2018-05-01
       1   |  2  | 2018-05-02  |  1     |  3  | 2018-05-01
       1   |  2  |    NULL     |  1     |  3  | 2018-05-03
       1   |  2  | 2018-05-30  |  1     |  3  | NULL

1 个答案:

答案 0 :(得分:1)

您应该执行 FULL OUTER JOIN 查询,如下所示

Select 
  C1.UserID,
  C1.cnt,
  C1.Date,
  C2.UserID,
  C2.cnt,
  C2.Date
from
db1.Customer C1
FULL OUTER JOIN
db2.Customer C2
on C1.UserId=C2.UserId and C1.date=C2.Date