Sql 查找三个表之间的差异

Sql 查找三个表之间的差异,sql,tsql,Sql,Tsql,我想找出a、b和c三张桌子之间的区别。我想加入所有三个,在每个表没有记录的地方显示空值 每个表都有两个我想加入的列,比如名字和姓氏 到目前为止,这就是我正在做的 从列表中选择* 完全外接 a、 firstName=b.firstName和a.lastname=b.lastname 完全外接 (c.firstName=a.firstName和c.lastName=a.lastName)或 (c.firstName=b.firstName和c.lastname=b.lastname) 我不相信我输

我想找出a、b和c三张桌子之间的区别。我想加入所有三个,在每个表没有记录的地方显示空值

每个表都有两个我想加入的列,比如名字和姓氏

到目前为止,这就是我正在做的

从列表中选择*
完全外接
a、 firstName=b.firstName和a.lastname=b.lastname
完全外接
(c.firstName=a.firstName和c.lastName=a.lastName)或
(c.firstName=b.firstName和c.lastname=b.lastname)
我不相信我输出的逻辑是正确的。有更好的方法吗?在英语中,第一个连接连接A和B,包括每个表中其他表中不存在的记录。第二个连接将A+B连接到C,如果匹配,则将C连接到A或B。

您可能需要:

select firstname, lastname, sum(in_a), sum(in_b), sum(in_c)
from ((select firstname, lastname, 1 as in_a, 0 as in_b, 0 as in_c
       from a
      ) union all
      (select firstname, lastname, 0 as in_a, 1 as in_b, 0 as in_c
       from b
      ) union all
      (select firstname, lastname, 0 as in_a, 0 as in_b, 1 as in_c
       from c
      )
     ) abc
group by firstname, lastname;
这应该使每个
firstname
/
lastname
配对,并提供有关配对在每个表中的次数的信息

我更喜欢
union all
/
group by
方法,而不是
left join
,原因如下:

  • 如果没有
    using
    子句,则在添加更多表时,
    on
    子句会变得有点棘手
  • 尽量少使用
    coalesce()
  • 更好地处理每个表中的重复项
  • 处理键的
    NULL

  • 一些示例数据和期望的结果会有所帮助。我相信您的查询符合您的要求。如果要排除a.firstName为null或b的匹配项,可以添加where子句。firstName为null或c.firstName为null@avery\u larry是的,我认为经过测试,你是对的。我很喜欢Gordon的实现思想是的,这些结果比我所做的更容易消化。谢谢