Oracle Sql - 如果内部 select returns 为 null,则丢弃外部 select,并避免多行
Oracle Sql - Discarding outer select if inner select returns null, and avoiding multiple rows
前信息:在我们公司,如果某人正在积极工作,他将被标记为 *。还有换部门的人
对于一份报告,我使用了 2 个名为 COMPANY_PERSON_ALL 和 trifm_izinler4 的表,加入 person_id 字段如下。
如果第一个内部 select returns 为空,我想丢弃(不列出)该行。
我想防止第二个内部 select 返回多个部门。
select izn.person_id, izn.adi_soyadi, izn.company_id,
(select a.employee_status from COMPANY_PERSON_ALL a where a.employee_status = '*' and a.person_id = izn.person_id) as Status,
(select a.org_code from COMPANY_PERSON_ALL a where a.person_id = izn.person_id) as Department,
izn.hizmet_suresi, izn.kalan_izin
from trifm_izinler4 izn
where trunc(rapor_tarihi) = trunc(SYSDATE)
你能帮我解决这两个内部select语句的问题吗?
假设您只想查看活动人员记录中的部门,您可以直接连接两个表而不是使用子查询表达式,并根据该状态进行过滤:
select izn.person_id, izn.adi_soyadi, izn.company_id,
a.employee_status as status, a.org_code as department
izn.hizmet_suresi, izn.kalan_izin
from trifm_izinler4 izn
join company_person_all a on a.person_id = izn.person_id
where rapor_tarihi >= trunc(SYSDATE)
-- and rapor_tarihi < trunc(SYSDATE) + 1 -- probably not needed
and a.employee_status = '*'
我也更改了日期比较;如果使用 trunc(rapor_tarihi)
进行比较,则无法使用该列上的普通索引,因此通常最好将原始值与范围进行比较。由于您要与今天的日期进行比较,因此您可能只需要查找大于今天午夜的值,但如果该列可以有未来的日期,那么您可以在明天午夜的范围内设置一个上限 - 我已经包含但评论了出。
如果一个人可以同时活跃于多个部门,那么这将显示所有这些,但您的措辞表明人们一次只能活跃于一个部门。如果您想查看所有活跃用户的 a 部门,但不一定是具有活跃标志的部门(或者如果可以有多个活跃用户),那么它有点复杂,并且您需要说明您希望如何选择要显示的内容。
前信息:在我们公司,如果某人正在积极工作,他将被标记为 *。还有换部门的人
对于一份报告,我使用了 2 个名为 COMPANY_PERSON_ALL 和 trifm_izinler4 的表,加入 person_id 字段如下。
如果第一个内部 select returns 为空,我想丢弃(不列出)该行。 我想防止第二个内部 select 返回多个部门。
select izn.person_id, izn.adi_soyadi, izn.company_id,
(select a.employee_status from COMPANY_PERSON_ALL a where a.employee_status = '*' and a.person_id = izn.person_id) as Status,
(select a.org_code from COMPANY_PERSON_ALL a where a.person_id = izn.person_id) as Department,
izn.hizmet_suresi, izn.kalan_izin
from trifm_izinler4 izn
where trunc(rapor_tarihi) = trunc(SYSDATE)
你能帮我解决这两个内部select语句的问题吗?
假设您只想查看活动人员记录中的部门,您可以直接连接两个表而不是使用子查询表达式,并根据该状态进行过滤:
select izn.person_id, izn.adi_soyadi, izn.company_id,
a.employee_status as status, a.org_code as department
izn.hizmet_suresi, izn.kalan_izin
from trifm_izinler4 izn
join company_person_all a on a.person_id = izn.person_id
where rapor_tarihi >= trunc(SYSDATE)
-- and rapor_tarihi < trunc(SYSDATE) + 1 -- probably not needed
and a.employee_status = '*'
我也更改了日期比较;如果使用 trunc(rapor_tarihi)
进行比较,则无法使用该列上的普通索引,因此通常最好将原始值与范围进行比较。由于您要与今天的日期进行比较,因此您可能只需要查找大于今天午夜的值,但如果该列可以有未来的日期,那么您可以在明天午夜的范围内设置一个上限 - 我已经包含但评论了出。
如果一个人可以同时活跃于多个部门,那么这将显示所有这些,但您的措辞表明人们一次只能活跃于一个部门。如果您想查看所有活跃用户的 a 部门,但不一定是具有活跃标志的部门(或者如果可以有多个活跃用户),那么它有点复杂,并且您需要说明您希望如何选择要显示的内容。