在查询中组合两个结果行

时间:2013-11-05 23:14:57

标签: sql postgresql relational-division

我有以下查询:

select user_id from user_tags
where user_id = 3086533

输出:

enter image description here

基本上,我希望能够接受此查询,并且如果同时出现名称“master_sbx”和“phonePicked”,则将其更改为仅包含user_id。

所以不要写一个查询:

select user_id from user_tags
where user_id = 3086533

输出:

enter image description here

我想添加仅包含appID的user_id的子句,其中同时应用了“master_sbx”和“phonePicked”,因此输出将返回

enter image description here

希望这是有道理的。我不确定它在PostGreSQL中是否真的有可能但是会喜欢任何反馈!这是我要写的一个更大的查询。

1 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望测试一个user_id是否(至少)出现在name = 'master_sbx'的行中以及name = 'phonePicked'行中。

许多方法可以做到这一点。最佳选择取决于您问题中不存在的信息。一种方法是使用EXISTS

SELECT DISTINCT user_id
FROM   user_tags
WHERE  user_id = 3086533
AND    name = 'master_sbx'
AND    EXISTS (
   SELECT 1 FROM user_tags
   WHERE  user_id = 3086533
   AND    name = 'phonePicked'
   )

自我加入的另一种方式:

SELECT DISTINCT u1.user_id
FROM   user_tags u1
JOIN   user_tags u2 USING (user_id)
WHERE  u1.user_id = 3086533
AND    u1.name = 'master_sbx'
AND    u2.name = 'phonePicked';
如果DISTINCT是唯一的,那么

(user_id, name)是多余的。

这可以视为relational division的特例。我们在这个相关的答案中汇集了一整套查询技术:
How to filter SQL results in a has-many-through relation