Sql 当特定列多次匹配时提取所有行
我的数据库中有下表Sql 当特定列多次匹配时提取所有行,sql,oracle,Sql,Oracle,我的数据库中有下表 |id|name |company_id|role | |1 |test1|11 |READADMIN | |2 |test2|11 |WRITEADMIN | |3 |test3|11 |READWRITEADMIN | |4 |test4|12 |READADMIN | |5 |test5|12 |WRITEADMIN | |6 |test6|12
|id|name |company_id|role |
|1 |test1|11 |READADMIN |
|2 |test2|11 |WRITEADMIN |
|3 |test3|11 |READWRITEADMIN |
|4 |test4|12 |READADMIN |
|5 |test5|12 |WRITEADMIN |
|6 |test6|12 |READWRITEADMIN |
|7 |test6|11 |READADMIN |
|8 |test7|13 |READADMIN |
|9 |test8|12 |READADMIN |
|10|test9|12 |READADMIN |
我的目标是提取所有具有相同公司id的READADMIN角色的管理员,并且这些用户的数量应该大于1
总的来说,我希望得到以下结果:
|id|name |company_id|role |
|1 |test1|11 |READADMIN|
|7 |test6|11 |READADMIN|
|4 |test4|12 |READADMIN|
|9 |test8|12 |READADMIN|
|10|test9|12 |READADMIN|
我已经创建了下面的select,但我不确定它们的准确性和性能:
SELECT id, name, company_id, role
FROM admin
WHERE company_id IN(SELECT CO.id
FROM company CO
join admin AU
ON CO.id = AU.company_id
WHERE role = 'READADMIN'
GROUP BY CO.id
HAVING Count(AU.id) > 1)
AND role = 'READADMIN';
最好知道上述任务的最佳方法。为什么不:
SELECT id, name, company_id, role
FROM admin
WHERE role = 'READADMIN'
GROUP BY company_id
HAVING Count(company_id) > 1
;
我想这样行得通:
SELECT DISTINCT id, name, company_id, role
FROM admin WHERE role='READADMIN' GROUP BY CO.id
我不知道你是不是这个意思。我从您的问题中了解到的是,您希望让所有用户知道他们的角色是“READADMIN”,并且不希望结果中有任何重复项。下面的代码片段应该只授予对表的一次访问权限,最好自己检查计划
SELECT a.*
FROM admin a
WHERE a.role = 'READADMIN'
AND EXISTS ( SELECT 'a'
FROM admin a2
WHERE a2.role = a.role
AND a2.company_id = a.company_id
AND a2.id <> a.id
)
select id,
name,
company_id,
role
from (
select id,
name,
company_id,
role,
count(distinct id) over (partition by company_id) as cn
from admin
where role = 'READADMIN'
)
where cn > 1;
我会这样做。显然,如果您已经有了一个实际的表,您就不需要了:
with admin as
(select 1 id,'test1' name,11 company_id, 'READADMIN' role from dual
union
select 2 id,'test2' name,11 company_id, 'WRITEADMIN' role from dual
union
select 3 id,'test3' name,11 company_id, 'READWRITEADMIN' role from dual
union
select 4 id,'test4' name,12 company_id, 'READADMIN' role from dual
union
select 5 id,'test5' name,12 company_id, 'WRITEADMIN' role from dual
union
select 6 id,'test6' name,12 company_id, 'READWRITEADMIN' role from dual
union
select 7 id,'test6' name,11 company_id, 'READADMIN' role from dual
union
select 8 id,'test7' name,13 company_id, 'READADMIN' role from dual
union
select 9 id,'test8' name,12 company_id, 'READADMIN' role from dual
union
select 10 id,'test9' name,12 company_id, 'READADMIN' role from dual)
select admin.id, admin.name, admin.company_id, admin.role
from admin
inner join
(select company_id, role
from admin
where role = 'READADMIN'
group by company_id, role having count(*) > 1) grouped
on admin.company_id = grouped.company_id
and admin.role = grouped.role;
谢谢,已更新。您不能在选择中使用名称、公司id、角色分组。很抱歉,它需要使用公司id而不是id。我用您的数据运行了脚本,它似乎可以工作。如果您想更改orderNo,可以在id上添加orderby子句。我已经用实际表和结果表更新了这个问题。此外,您的选择不起作用,谢谢。我想是我在四处张望。您能解释一下我们需要在subselect中提取“a”的目的吗?当subselect至少有一行时,EXISTS函数为true。内容不重要,但您必须在SELECT中放入一些内容。。我选择“a”,但您可以编写SELECT*。。。。这与查询无关