postgresql 使用AND?的SQL查询

zzwlnbp8  于 2022-12-23  发布在  PostgreSQL
关注(0)|答案(2)|浏览(175)

我在编写请求时遇到了一点问题。对于下面的数据示例,我希望恢复document_type_id = 18和20的archive_id

+------------+------------------+
    | archive_id | document_type_id |
    +------------+------------------+
    |          1 |               20 |
    |          1 |               18 |
    |          3 |               20 |
    |          4 |               11 |
    |          2 |               23 |
    |          5 |               20 |
    |          6 |               23 |
    |          6 |               20 |
    |          6 |               18 |
    +------------+------------------+

预期结果:

+------------+
    | archive_id |
    +------------+
    |          1 |
    |          6 |
    +------------+

问题相同,但document_type_id = 18、20和23预期结果:

+------------+
    | archive_id |
    +------------+
    |          6 |
    +------------+

谢谢你的帮助

hujrc8aj

hujrc8aj1#

一个简单的拥有计数就可以了。
首例

select archive_id
from your_table
where document_type_id in (18,20)
group by archive_id
having count(distinct document_type_id) =2;

https://dbfiddle.uk/MnjR_4a _
第二个案件

select archive_id
from your_table
where document_type_id in (18,20,23)
group by archive_id
having count(distinct document_type_id) =3;

https://dbfiddle.uk/v9m3nPiq

wlzqhblo

wlzqhblo2#

对于一般的解决方案,例如,可以使用包含要搜索的archive_id的数组:

WITH searched(ids) AS (VALUES (ARRAY[18,20,23]))
SELECT tab.archive_id
FROM tab CROSS JOIN searched
WHERE tab.document_type_id = ANY (searched.ids)
GROUP BY tab.archive_id
HAVING count(DISTINCT document_type_id) = cardinality(searched.ids);

相关问题