Oracle SQL只显示某些结果

时间:2016-05-27 13:35:44

标签: sql oracle

我们有一组将要退休的许可证号码(' 01',' 02',' 03') 一些员工的许可证号码即将到期,许可证号码将保持活动状态 我的结果只需要显示具有退休许可证号码的员工 如果员工有这两种情况,那么他们就不应该在结果中 这是我无法让它工作的部分

表:tbl_lcns_num 插入表

我的查询是

Select * from tbl_lcns_num
Where lcns_num in('01','02','03')
AND lcns_num NOT in('04','05','06');

我也试过这个

Select * from tbl_lcns_num
Where lcns_num in (('01','02','03') AND lcns_num NOT in('04','05','06'));

我的表是:

Table

My result is

我预计只有员工QRS456才会出现在结果中

我甚至尝试过创建临时表;一个用于有效许可证号码,另一个用于退出许可证号码 我使用存在而不存在适用的结果是相同的。

我的查询应该是什么来获得预期的结果?

6 个答案:

答案 0 :(得分:1)

{' 01',' 02',' 03')中的单个lcns_num值必须始终

select * from tbl_lcns_num t1
where lcns_num in ('01','02','03')
and not exists (
  select null from tbl_lcns_num t2
  where t2.emp_num = t1.emp_num
  and lcns_num not in ('01','02','03')
);

对于与您即将退休的号码相匹配的每一行,not exists会查找该列表中的同一员工的行 - 此时此行将为04 ,05和06,但也允许你没有显示的其他值。

快速演示:

with tbl_lcns_num (pk, emp_num, lcns_num) as (
  select 12345, 'ABC123', '01' from dual
  union all select 12345, 'ABC123', '02' from dual
  union all select 12346, 'ABC123', '04' from dual
  union all select 12348, 'XYZ789', '05' from dual
  union all select 12349, 'XYZ789', '06' from dual
  union all select 12340, 'QRS456', '01' from dual
)
select * from tbl_lcns_num t1
where lcns_num in ('01','02','03')
and not exists (
  select null from tbl_lcns_num t2
  where t2.emp_num = t1.emp_num
  and lcns_num not in ('01','02','03')
);

        PK EMP_NU LC
---------- ------ --
     12340 QRS456 01

答案 1 :(得分:0)

尝试此查询:

SELECT DISTINCT EMP_NUM
FROM tbl_lcns_num
WHERE lcns_num IN ('01','02','03')
MINUS
SELECT DISTINCT EMP_NUM
FROM tbl_lcns_num
WHERE lcns_num IN ('04','05','06');

答案 2 :(得分:0)

Select * from tbl_lcns_num Where lcns_num in('01','02','03')
and emp_num not in 
(select emp_num from tbl_lcns_num Where lcns_num in('04','05','06') )

答案 3 :(得分:0)

您可以轻松地将您的需求细分为两个逻辑步骤:

  1. 显示许可证即将过期的所有用户
  2. 排除至少有一个未过期的许可证的所有用户。
  3. 因此,您可以在SQL语句中使用MINUS运算符。以下是官方文档的link

    我现在无权访问oracle数据库,但您的查询应该是:

    SELECT DISTINCT EMP_NUM
    FROM tbl_lcns_num
    WHERE lcns_num IN('01','02', '03') 
    MINUS
    SELECT DISTINCT EMP_NUM
    FROM tbl_lcns_num WHERE lcns_num IN('04','05','06')
    

答案 4 :(得分:0)

试试这个:

SELECT license1.pk,
       license1.emp_num,
       license1.lcns_num
FROM   tbl_lcns_num license1
WHERE  license1.lcns_num IN ('01','02','03')
  AND  NOT EXISTS (SELECT *
                   FROM   tbl_lcns_num license2
                   WHERE  license1.emp_num = license2.emp_num
                     AND  license2.lcns_num NOT IN ('01','02','03'));

答案 5 :(得分:0)

如果您只想显示员工编号,则可以汇总您的记录,例如:

Select emp_num
from tbl_lcns_num
group by emp_num
having max(lcns_num) < '04';

如果您想要显示许可证,也可以在许可证上添加listagg:

Select 
  emp_num,
  listagg(lcns_num, ', ') within group (order by lcns_num) as licenses
from tbl_lcns_num
group by emp_num
having max(lcns_num) < '04';