Postgres查询IN查询

时间:2018-04-19 12:10:16

标签: sql postgresql

在Postgres中是否有可能确定查询1中是否至少有一个结果在查询2结果中? 例如:

SELECT * FROM items 
WHERE
(SELECT id FROM users) IN (SELECT user_id FROM user_items WHERE item_id = 1)

我知道这个查询可能是一个废话,我只是在询问如何在where子句中进行检查。在我的真实查询中(更复杂),我得到了:

  

(Postgrex.Error)ERROR 21000(cardinality_violation):用作表达式的子查询返回的多行

如果query1(query1 IN query2)中有多个结果

修改

 select user_id 
 from notification_token n 
   join notification_folder f on n.user_id = f.user_id
where ((SELECT tag_id FROM notification_folder_tag WHERE notification_folder_id = f.id) IN (SELECT tag_id FROM event_tag WHERE event_id = 1))

表:

notification_token

| user_id | notification_token                   |
--------------------------------------------------
| 1       | token1                               |
| 2       | token2                               |
| 3       | token3                               |

notification_folder

| user_id                | data                  |
--------------------------------------------------
| 1                      | "useless string"      |

notification_folder_tag

| notification_folder_id | tag_id                |
--------------------------------------------------
| 1                      | 1                     |
| 1                      | 2                     |
| 2                      | 5                     |

event_tag

| event_id               | tag_id                |
--------------------------------------------------
| 1                      | 1                     |
| 2                      | 2                     |
| 3                      | 8                     |

我想要的结果是来自notification_token的user_id 1。

"其中"应该是真的,因为IN(结果1,2)的左侧至少有一个tag_id包含在IN的右侧(结果1)。 无论如何,当IN的左侧由多个条目组成时,我会收到错误。只需一个条目就可以正常使用

2 个答案:

答案 0 :(得分:0)

您似乎想要任何订购item_1的人也订购了物品。如果这种解释是正确的,那么这是编写查询的一种方法:

select distinct i.*
from items i join
     user_items ui
     on ui.item_id = i.item_id
where ui.user_id in (select ui2.user_id
                     from user_items ui2
                     where ui2.item_id = 1
                    );

答案 1 :(得分:0)

试试这个

SELECT * FROM items
在哪里 EXISTS(SELECT FROM FROM users)
IN (SELECT user_id FROM user_items WHERE item_id = 1);

如果这不起作用,请转到关系数据库查询。