Oracle10g 如何使用复合键制作筛选器
我想制作一个过滤器,在其中检查所有部门状态是否为Y,然后返回该记录的emp_代码所有部门平均值过滤器检查值从1-4,并且还匹配状态=Y 部门id和emp代码是复合键 我做了这个查询,但它没有返回期望的结果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,但是我想
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