Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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_Oracle10g - Fatal编程技术网

Sql 如何让不具备特定技能的员工脱颖而出

Sql 如何让不具备特定技能的员工脱颖而出,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有一个有两列的表。员工id,每个员工和员工技能集的下一列都是唯一的。一名员工可以拥有多个技能集。如果A、B、c、D、E是员工可以拥有的五种技能集,那么如何检索没有技能集“c”的不同员工列表 employee_id skillset 1 A 1 C 2 E 3 A 3 B 3 C 4 D 4 C 5 B 我尝试过自连

我有一个有两列的表。员工id,每个员工和员工技能集的下一列都是唯一的。一名员工可以拥有多个技能集。如果A、B、c、D、E是员工可以拥有的五种技能集,那么如何检索没有技能集“c”的不同员工列表

employee_id skillset
1           A
1           C
2           E
3           A
3           B
3           C
4           D
4           C
5           B
我尝试过自连接和其他方法,但不起作用

select distinct employee_id from employee_skillset where skillset not like 'C'
当我运行查询时,它仍然会给我员工id,这些id的skillset为c

您可以按员工id分组,并在HAVING子句中设置一个条件:

select employee_id 
from employee_skillset 
group by employee_id
having sum(case when skillset = 'C' then 1 else 0 end) = 0
或不存在:

select distinct s.employee_id 
from employee_skillset s
where not exists (
  select 1 from employee_skillset
  where employee_id = s.employee_id and skillset = 'C'
)  

您对数据集的预期结果是什么?2号和5号

为什么不像下面这样

SELECT DISTINCT employee_id
FROM Table1
WHERE skillset <> 'C';
减集运算符是一个选项:

SQL> with employee_skillset (employee_id, skillset) as
  2    (select 1, 'a' from dual union all
  3     select 1, 'c' from dual union all
  4     select 2, 'e' from dual union all
  5     select 3, 'a' from dual union all
  6     select 3, 'b' from dual union all
  7     select 3, 'c' from dual union all
  8     select 4, 'd' from dual union all
  9     select 4, 'c' from dual union all
 10     select 5, 'b' from dual
 11    )
 12  select employee_id from employee_skillset
 13  minus
 14  select employee_id from employee_skillset where skillset = 'c';

EMPLOYEE_ID
-----------
          2
          5

SQL>
还有一个选择:

 <snip>
 12  select employee_id
 13  from (select employee_id,
 14               case when skillset = 'c' then 1 else 0 end flag
 15        from employee_skillset
 16       )
 17  group by employee_id
 18  having sum(flag) = 0;

EMPLOYEE_ID
-----------
          2
          5

SQL>
或:


你考虑过为什么你会得到这些答案吗?基本上,您的查询首先选择skillset不是C的所有行,然后请求不同的ID。听起来好像你需要从另一端发起一些攻击。使用带有NOT EXISTS的sub query。为什么不使用下面的方法,因为如果员工还拥有其他技能,这将返回技能为“C”的员工。
 <snip>
 12  select employee_id
 13  from (select employee_id,
 14               listagg(skillset, ',') within group (order by null) lagg
 15        from employee_skillset
 16        group by employee_id
 17       )
 18  where instr(lagg, 'c') = 0;

EMPLOYEE_ID
-----------
          2
          5

SQL>