【问题标题】:PSQL: select all assets that have all of given list of associated objects idsPSQL:选择具有所有给定关联对象ID列表的所有资产
【发布时间】:2010-08-11 10:29:58
【问题描述】:

假设我们有一个标准拥有并属于产品和类别之间的许多关联 product_categories 表由 product_id 和 category_id 对组成。

我们有 category_id 的列表,需要选择属于所有这些类别的所有产品。

我想到的最佳方法是在编程语言级别由 AND 连接的 where 子句中有多个 EXISTS()

SELECT * FROM products p WHERE 
EXISTS(SELECT * FROM product_categories pc 
   WHERE pc.product_id = p.id AND pc.category_id = {first_id}) AND
EXISTS(SELECT * FROM product_categories pc 
   WHERE pc.product_id = p.id AND pc.category_id = {second_id}) AND ...

EXISTS 在 Postgres 8.4 中速度很快,因此这种方法没有性能问题。

但我不知道做这种类型的查询还有什么更优雅的吗?

【问题讨论】:

    标签: sql performance optimization postgresql


    【解决方案1】:
    SELECT * FROM products p WHERE 
    EXISTS(SELECT * FROM product_categories pc 
           WHERE pc.product_id = p.id AND pc.category_id = {first_id}) 
    INTERSECT
    SELECT * FROM products p WHERE 
    EXISTS(SELECT * FROM product_categories pc 
           WHERE pc.product_id = p.id AND pc.category_id = {second_id}) 
    INTERSECT
    ....
    

    【讨论】:

    • 因为它会找到至少有一个给定 category_id 但不是全部的产品。
    • @Bogdan,错过了。好的,这种情况你可以试试 INTERSECT
    • 使用 INTERSECT 应该是什么样子?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多