2014-11-24 74 views
2

我想知道如果它是可行的(在一個查詢中,如果可能的話),使查詢返回一個默認值,如果一行丟失?例如需要這2個表,給我的查詢需要2個參數(place_id和USER_ID)如果找不到行,SQL返回默認值[PostgreSQL]

T1 
place_id/tag_id 
1   2 
1   3 
1   4 
2   4 
3   2 
4   5 

T2 
user_id/tag_id/count 
100   2  1 
100   3  20 
200   4  30 
200   2   2 
300   5  22 

正如你看到的,這對用戶/標籤(100,4)丟失。我想歸檔是一個查詢將返回我這3個結果

tag_id/count 
2   1 
3   20 
4   0 

我知道,我可以像這樣做到這一點,但它並沒有真正匹配的最終結果爲它只能如果我預先知道TAG_ID ......明明只返回1行..:

SELECT T1.tag_id, T2.count 
from T1 t1 
    left join T2 t2 on t1.tagId=t2.tag_id 
where t1.place_id=1 
UNION ALL 
select tag_id,0 
from T1 
where not exist (select 1 from T2 where user_id=100 and tag_id=4) 
    and tag_id=4; 

編輯:我的問題是不完整的,有失蹤案件 這裏有一個例子(@a_horse_with_no_name的curtesy)http://sqlfiddle.com/#!12/67042/4

謝謝!

+1

具有'tag_id = 4 **'的行將由外部聯接返回。所有你需要的是使用'coalesce()'將'null'值轉換爲'0'參見這裏的例子:http://sqlfiddle.com/#!12/ed7bf/1 – 2014-11-24 11:18:18

+0

@a_horse_with_no_name我們可以加入不是外部/主鍵的列上的表? – 2014-11-24 11:22:10

+0

您可以使用匹配的數據類型在任何列上連接表。 – 2014-11-24 11:23:14

回答

1

外連接將已經照顧你想要的東西。

由於t1是連接的「左表」,因此將返回來自t1的所有行。然後,「右表」(例如t2)中的列將具有null值。所以,你只需要來轉換null0

select t1.tag_id, coalesce(t2.cnt, 0) 
from T1 t1 
    left join T2 t2 on t1.tag_Id=t2.tag_id 
and t1.place_id = 1; 

SQLFiddle例如:http://sqlfiddle.com/#!12/ed7bf/1


無關,但:

使用count爲列名是一個非常糟糕的主意,因爲它會要求您始終將列名用雙引號括起來:t2."count",因爲它是保留字。另外它並沒有真正記錄列的目的。你應該找到一個更好的名字。

+0

關於列名稱,我的問題中的表格已經完成,並且可以隨時輸入。我一直在我的表格上嘗試這個查詢,並且我意識到它並不完全返回我想要的結果,請看這個示例。http://sqlfiddle.com/# !12/67042/4(我已添加其他標記和用戶) – Johny19 2014-11-24 11:46:48

+0

@ Johny19:請編輯您的問題,並根據您的SQLFiddle包括預期的輸出(包括SQLFiddle在您的問題中的鏈接) – 2014-11-24 11:48:28

+0

done,sorry about that – Johny19 2014-11-24 11:51:16