Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当特定列多次匹配时提取所有行_Sql_Oracle - Fatal编程技术网

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*。。。。这与查询无关