2013-07-10 186 views
2

我有2個表具有相同的用戶ID,類別,計數模式。我需要一個查詢來總結每個用戶ID /類別對的計數。有時候一對會存在於一張桌子裏,而不是另一張。我在執行連接時遇到了問題,而不會丟失僅在1個表中存在用戶ID /類別對的行。這就是我想要(沒有成功):SQL連接不丟失行

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 

更新: 「計數」 是而不是實際的列名稱。爲了這個例子我只是用它,我忘了它是一個保留字。

+0

ID2爲什麼不總結?它在兩個表中。 –

+0

@SNash,類別不同。您可能需要重新閱讀求和要求。 –

回答

4

您需要:

  1. 使用全外連接,所以你不降在一個表中存在的行,而不是其他
  2. 合併之前,除了計數,因爲0 + NULL = NULL

另外,因爲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 
+0

完美!我沒有意識到COALESCE,這正是我需要的。我也相信「AS [count]」是無關的,因爲你在該行的開始處有「[count] =」。 – JCB

+0

@JCB,我的意思是刪除'''[count] ='''部分,這是我在上次編輯中完成的。感謝您指出了這一點。 –

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