SQL连接不会丢失行

时间:2013-07-10 18:56:32

标签: sql sql-server join jointable

我有2个表具有相同的userID,category,count模式。我需要一个查询来总结每个用户ID /类别对的计数。有时一对将存在于一个表中而不存在于另一个表中。我在进行连接时遇到问题,而不会丢失仅在1个表中存在userID /类别对的行。这就是我正在尝试的(没有成功):

select a.user, a.category, count=a.count+b.count
from #temp1 a join #temp2 b
on a.user = b.user and a.category = b.category

示例:

输入:

user    category    count
id1     catB        3
id2     catG        9
id3     catW        17

user    category    count
id1     catB        1
id2     catM        5
id3     catW        13

期望的输出:

user    category    count
id1     catB        4
id2     catG        9
id2     catM        5
id3     catW        30

更新:“count”不是实际的列名。我只是为了这个例子而使用它,我忘了它是一个保留字。

2 个答案:

答案 0 :(得分:4)

你需要:

  1. 使用完全外部联接,这样就不会删除一个表中的行而不会删除另一个
  2. 中的行
  3. 在添加之前合并计数,因为0 + NULL = NULL
  4. 另外,由于COUNT是保留字,我建议将其转义。

    因此,使用所有这些指南,您的查询将变为:

    SELECT COALESCE(a.user, b.user) AS user, 
           COALESCE(a.category, b.category) AS category, 
           COALESCE(a.[count],0) + COALESCE(b.[count],0) AS [count]
    FROM #temp1 AS a 
    FULL OUTER JOIN #temp2 AS b
                 ON a.user = b.user AND 
                    a.category = b.category
    

答案 1 :(得分:1)

解决这个问题的一种方法是使用完全外连接:

select coalesce(a.user, b.user) as user,
       coalesce(a.category, b.category) as category,
       coalesce(a.count, 0) + coalesce(b.count, 0) as "count"
from #temp1 a full outer join
     #temp2 b
     on a.user = b.user and
         a.category = b.category;

使用full outer join时,必须小心,因为当只有一个表匹配时,关键字段可以是NULL。因此,select往往会有很多coalesce()个(或类似的结构)。

另一种方法是使用聚合的union all查询:

select "user", category, SUM(count) as "count"
from ((select "user", category, "count"
       from #temp1
      ) union all
      (select "user", category, "count"
       from #temp2
      )
     ) t
group by "user", category