多对多关系过滤器

And*_*ius 1 sql postgresql database-design openerp relational-division

我需要使用与另一个表有许多关系的类别表来过滤我的查询.是否可以使用many2many关系过滤查询?

res_partner有很多category_id与表相关的字段res_partner_category.res_partner,或者我们只是说合作伙伴可以有很多类别.我需要的是过滤res_partners表中有"business"或"retail"类别的表.如果它没有任何这些类别,则不应显示.

另外还有另一个领域,res_partnercategory_value_ids与以下领域有one2many关系res_partners_category_value:

res_partner 有关系的以下字段:

  • category_idres_partner_category(很多2)
  • category_value_idsres_partner_category_value(one2many)
  • name (炭)

res_partner_category 有关系的以下字段:

  • partner_idsres_partner(很多2)
  • name (炭)

res_partner_category_value 有关系的以下字段:

  • category_group_idres_partner_category(很多)
  • category_idres_partner_category(很多)
  • object_idres_partner(很多)

但是,如果我尝试res_partner_category_value在SQL查询中使用表,我会收到错误,我无法在查询中使用它.

例如,如果有4个合作伙伴具有以下类别:

  • 第一种:categ1,categ2,business
  • 第二:零售
  • 第三:零售,商业
  • 第四种:categ1,categ2

查询应返回第一,第二和第三个伙伴.
一个人告诉我,不可能像many2many关系这样过滤.所以我想知道它真的不可能或只是复杂吗?

编辑:
我发现还有一个表叫做res_partner_category_rel.我没有看到它,因为在Openerp管理界面中,您可以看到数据库的所有对象,该表未显示.您只能通过数据库直接看到它.所以我对这个"缺失"的表感到困惑:

res_partner_category_rel:

  • partner_id (many2one)
  • category_id (many2one)

Erw*_*ter 5

这是应该提供的测试用例:

CREATE TABLE partner (
  partner_id serial PRIMARY KEY
, partner    text
);
INSERT INTO partner (partner) VALUES 
  ('partner1')
, ('partner2')
, ('partner3')
, ('partner4')
;    
CREATE TABLE category (
  category_id serial PRIMARY KEY
, category    text
);
INSERT INTO category (category) VALUES 
  ('categ1')
 ,('categ2')
 ,('business')
 ,('retail');

CREATE TABLE partner_category (
  partner_id  int REFERENCES partner(partner_id)
, category_id int REFERENCES category(category_id)
, CONSTRAINT cat_pk PRIMARY KEY (partner_id, category_id)
);
INSERT INTO partner_category (partner_id, category_id) VALUES 
   (1,1), (1,2), (1,3)
  ,(2,4)
  ,(3,3), (3,4)
  ,(4,1), (4,2);
Run Code Online (Sandbox Code Playgroud)

这是您追求的查询(许多可能的变体之一):

SELECT p.*
FROM   partner p
WHERE  EXISTS (SELECT * FROM partner_category pc
               WHERE  pc.partner_id = p.partner_id AND pc.category_id = 3)
OR     EXISTS (SELECT * FROM partner_category pc
               WHERE  pc.partner_id = p.partner_id AND pc.category_id = 4)
ORDER  BY p.partner_id;
Run Code Online (Sandbox Code Playgroud)

SQL小提琴.

这里的关键词是关系分裂.在这个相关问题下,我们已经汇集了一整套查询来处理这类问题: