Oracle10g 如何使用复合键制作筛选器

Oracle10g 如何使用复合键制作筛选器,oracle10g,Oracle10g,我想制作一个过滤器,在其中检查所有部门状态是否为Y,然后返回该记录的emp_代码所有部门平均值过滤器检查值从1-4,并且还匹配状态=Y 部门id和emp代码是复合键 我做了这个查询,但它没有返回期望的结果 select distinct(emp_code) from fsc_sts_dpt where dept_id in (1,2,3,4) and status= 'Y' 问题是DepTydID 1,2,其中EMPOSCODE=101010是空的,所以在运算符中也考虑101010,但是我想

我想制作一个过滤器,在其中检查所有部门状态是否为Y,然后返回该记录的emp_代码所有部门平均值过滤器检查值从1-4,并且还匹配状态=Y

部门id和emp代码是复合键

我做了这个查询,但它没有返回期望的结果

select distinct(emp_code) from fsc_sts_dpt where dept_id in (1,2,3,4) and status= 'Y'

问题是DepTydID 1,2,其中EMPOSCODE=101010是空的,所以在运算符中也考虑101010,但是我想如果关于DEPtTyID的任何状态都是空的,它将不会出现在输出中。

看来,您想简单地选择何处状态=‘Y’< /P>

select distinct(emp_code) from fsc_sts_dpt where ifnull(status,'N') ='Y' ;

你最后的评论是什么

select distinct(emp_code) from fsc_sts_dpt 
where dept_if not in (select distinct dept_id from  
                             fsc_sts_dpt is null) ;

我相信这就是你想要的

SELECT emp_code
FROM fsc_sts_dpt
GROUP BY emp_code
HAVING count(*) = count (CASE WHEN status='Y' THEN 1 ELSE NULL END)
检查所有部门状态是否为Y,然后从1-4返回记录所有部门平均值过滤器检查值的emp_代码,并与状态=Y匹配

首先,这将只查找所有条目的
状态
'Y'
emp\u代码(不考虑
部门id
),其次,检查这些
emp\u代码
是否至少有一个
部门id
,其值为
1,2,3,4

SELECT emp_code
FROM   (
  SELECT   emp_code,
           COUNT( CASE WHEN dept_id IN ( 1, 2, 3, 4 ) THEN 1 END ) AS num_depts
  FROM     fsc_sts_dpt
  GROUP BY emp_code
  HAVING   COUNT( CASE WHEN status = 'Y' THEN NULL ELSE 1 END ) = 0
)
WHERE num_depts > 0
如果您只想检查(1,2,3,4)
中所有
部门id的
状态是否为
'Y'
,则可以将其简化为:

SELECT   emp_code
FROM     fsc_sts_dpt
WHERE    dept_id IN ( 1, 2, 3, 4 )
GROUP BY emp_code
HAVING   COUNT( CASE WHEN status = 'Y' THEN NULL ELSE 1 END ) = 0
试一试


由于
dept\u id和emp\u code是复合键
不会有两个相同的
dept\u id
emp\u code
,因此计数将为
4
表示(1、2、3、4)中的
dept\u id
状态='Y'

我已经尝试了这个检查说明我在一分钟前修改了说明我已经更新了答案。。亲爱的,如果null在oracle中无效,你知道它会引发一个错误吗?标签中有mysql,但对于oracle。。使用NVL(..)NVL(状态,'N')='Y'是MYSQL还是Oracle?修正你的标签。你能给出一个你想要的预期输出的样本吗?我从你的问题中删除了三个标签。根本不适用,非常广泛,标签摘录建议使用更具体的标签,并明确指出它是关于Oracle RDBMS的,而不是关于其他产品(如MySQL)。添加标签时请注意。好的,我以后会记得的。谢谢。您想要的输出是什么?只是
150021
151015
(因为所有行的
status=Y
)但是问题是EdtTyIID 1,2,其中EMPOSCODE=101010是空的,所以考虑101010,但是我想如果关于DEPtTyID的任何状态都是空的,它不会出现在输出中,您也可以考虑101010YH,请解释您的查询,我想理解它:代码>计数(*)< /C>是唯一考虑空值的聚合函数。这意味着对于
emp\u code=101010
,您将有
count(*)=4
,因为您有4行
emp\u code=101010
<代码>计数(状态=y′,然后1个其他空结束)< >代码>只计算行>代码>状态=y′/代码>,因为如果状态不是“y”,则将得到null,而<代码>计数(列)< /代码>不考虑空值,这意味着,对于<代码> EMPICODE=101010 < /代码>计数(状态)将为2,由于只有两行没有空状态,请您证明此计数(状态为“Y”时,则为空,否则为1 END)=0计数如何等于零我对此
COUNT()
将不计算
null
值有点混淆;因此,当
status='Y'
时,
CASE
表达式返回
NULL
且该行不被计数,对于所有其他行(包括
NULL
状态值),
CASE
返回1且该行被计数。因此,如果
COUNT(…)=0
,则所有行都将具有
status='Y'
,如果
COUNT(…)>0
,则至少会有一行
status为NULL或status'Y'
。您还可以将其作为前面的case表达式的反式编写,如下所示:
HAVING COUNT(状态为空或状态为“Y”时,则为1结束)=0
select emp_code
from fsc_sts_dpt
where status = 'Y'
and dept_id in (1, 2, 3, 4)
group by emp_code
having count(*) = 4