我想知道是否可行(如果可能,在一个查询中),如果缺少行,则查询返回默认值?例如,取这两个表并给出我的查询需要2个参数(place_id和user_id)
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行..:< / p>
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;
编辑:我的问题没有完整,并且遗失了案件 这是一个例子(curtesy of @a_horse_with_no_name)http://sqlfiddle.com/#!12/67042/4
谢谢!
答案 0 :(得分:1)
外部联接已经处理了你想要的东西。
由于t1
是&#34;左表&#34;对于连接,将返回t1
中的所有行。来自&#34;右表&#34;的列(您的示例中为t2
)将具有null
值。因此,您只需将null
转换为0
:
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"
因为它是一个保留字。另外,它并没有真正记录专栏的用途。你应该找到一个更好的名字。