2010-08-11 26 views
0

假設我們有一個標準並且屬於產品和類別之間的許多關聯 product_categories表由product_id和category_id對組成。PSQL:選擇具有所有給定關聯對象列表的所有資產ID

我們有category_id的列表,需要選擇屬於所有這些類別的所有產品。

是來到我的腦海裏,最好的方法是有多個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等等這種方法沒有性能問題。

但是我更喜歡做這種類型的查詢嗎?

回答

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 
.... 
+0

因爲它會查找至少有一個給定的category_id但不是全部的產品。 – 2010-08-11 10:44:37

+0

@Bogdan,錯過了。好的,你可以嘗試INTERSECT這種情況下 – 2010-08-11 11:43:23

+0

它應該如何與INTERSECT? – 2010-08-11 11:57:30

相關問題