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_partner它category_value_ids与以下领域有one2many关系res_partners_category_value:
res_partner 有关系的以下字段:
category_id到res_partner_category(很多2)category_value_ids到res_partner_category_value(one2many)name (炭)res_partner_category 有关系的以下字段:
partner_ids到res_partner(很多2)name (炭)res_partner_category_value 有关系的以下字段:
category_group_id到res_partner_category(很多)category_id到res_partner_category(很多)object_id到res_partner(很多)但是,如果我尝试res_partner_category_value在SQL查询中使用表,我会收到错误,我无法在查询中使用它.
例如,如果有4个合作伙伴具有以下类别:
查询应返回第一,第二和第三个伙伴.
一个人告诉我,不可能像many2many关系这样过滤.所以我想知道它真的不可能或只是复杂吗?
编辑:
我发现还有一个表叫做res_partner_category_rel.我没有看到它,因为在Openerp管理界面中,您可以看到数据库的所有对象,该表未显示.您只能通过数据库直接看到它.所以我对这个"缺失"的表感到困惑:
res_partner_category_rel:
partner_id (many2one)category_id (many2one)这是您应该提供的测试用例:
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)
这里的关键词是关系分裂.在这个相关问题下,我们已经汇集了一整套查询来处理这类问题: