Postgres - select 行,除非计数大于一个和另一个条件
Postgres - select rows except where count is more than one and another condition
我有一个包含以下示例数据的 table:
appuser_id business_id role_id
6 2 CLIENT_MANAGER
8 2 CLIENT_ADMIN
6 3 BUSINESS_MANAGER
8 3 BUSINESS_MANAGER
6 4 BUSINESS_MANAGER
8 5 BUSINESS_MANAGER
8 6 BUSINESS_MANAGER
我想创建一个函数,为他的角色 'BUSINESS_MANAGER'
的用户提取所有企业的列表,但是,如果多人管理一个企业(上面的企业 3),并且其中一个用户碰巧在任何其他业务中也有 'CLIENT_ADMIN'
角色,我想跳过那个有争议的记录(跳过业务 3),基本上,给出这个查询:
SELECT * FROM my_table WHERE appuser_id = 8 AND role_id = 'BUSINESS_MANAGER' AND ???;
我想要以下结果:
appuser_id business_id role_id
8 5 BUSINESS_MANAGER
8 6 BUSINESS_MANAGER
对于我想要的用户 6 的相同查询:
appuser_id business_id role_id
6 3 BUSINESS_MANAGER
6 4 BUSINESS_MANAGER
我不知道从哪里开始这样的事情。
如果谁有更好的标题,欢迎修改。
正如评论中所建议的,您可以使用 not exists
:
select *
from my_table mt
where mt.appuser_id = 6
and mt.role_id = 'BUSINESS_MANAGER'
and mt.business_id not in (
select imt.business_id
from my_table imt
where exists (
select *
from my_table iimt
where imt.appuser_id <> iimt.appuser_id
and iimt.appuser_id = mt.appuser_id
and iimt.role_id = 'CLIENT_ADMIN'
)
)
我有一个包含以下示例数据的 table:
appuser_id business_id role_id
6 2 CLIENT_MANAGER
8 2 CLIENT_ADMIN
6 3 BUSINESS_MANAGER
8 3 BUSINESS_MANAGER
6 4 BUSINESS_MANAGER
8 5 BUSINESS_MANAGER
8 6 BUSINESS_MANAGER
我想创建一个函数,为他的角色 'BUSINESS_MANAGER'
的用户提取所有企业的列表,但是,如果多人管理一个企业(上面的企业 3),并且其中一个用户碰巧在任何其他业务中也有 'CLIENT_ADMIN'
角色,我想跳过那个有争议的记录(跳过业务 3),基本上,给出这个查询:
SELECT * FROM my_table WHERE appuser_id = 8 AND role_id = 'BUSINESS_MANAGER' AND ???;
我想要以下结果:
appuser_id business_id role_id
8 5 BUSINESS_MANAGER
8 6 BUSINESS_MANAGER
对于我想要的用户 6 的相同查询:
appuser_id business_id role_id
6 3 BUSINESS_MANAGER
6 4 BUSINESS_MANAGER
我不知道从哪里开始这样的事情。
如果谁有更好的标题,欢迎修改。
正如评论中所建议的,您可以使用 not exists
:
select *
from my_table mt
where mt.appuser_id = 6
and mt.role_id = 'BUSINESS_MANAGER'
and mt.business_id not in (
select imt.business_id
from my_table imt
where exists (
select *
from my_table iimt
where imt.appuser_id <> iimt.appuser_id
and iimt.appuser_id = mt.appuser_id
and iimt.role_id = 'CLIENT_ADMIN'
)
)