PSQL: выберите все активы, которые имеют весь список идентификаторов связанных объектов - PullRequest
0 голосов
/ 11 августа 2010

Предположим, что у нас есть стандарт, который принадлежит многим ассоциациям между продуктами и категориями. Таблица product_categories состоит из пар product_id и category_id.

У нас есть список category_id, и нам нужно выбрать все товары, которые принадлежат всем этим категориям..

Лучший подход, который мне пришёл в голову, это иметь несколько EXISTS () в выражении where, соединенном AND на уровне языка программирования:

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 Ответ

1 голос
/ 11 августа 2010
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
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...