在SQL查询中两天内找到新记录
我正在使用查询检查两个表中更改的叶子:-在SQL查询中两天内找到新记录,sql,oracle,union,Sql,Oracle,Union,我正在使用查询检查两个表中更改的叶子:- with present_day as ( select 1 as emp_id,'Sick Leave' as code , 9 as net_entitlement from dual union select 2 as emp_id,'Privilege Leave' as code , 5 as net_entitlement from dual union select 3 as emp_id,'Sick Leave' as code , 5
with present_day
as
(
select 1 as emp_id,'Sick Leave' as code , 9 as net_entitlement from dual
union
select 2 as emp_id,'Privilege Leave' as code , 5 as net_entitlement from dual
union
select 3 as emp_id,'Sick Leave' as code , 5 as net_entitlement from dual
union
select 5 as emp_id,'Sick Leave' as code , 10 as net_entitlement from dual
),
yester_day
as
(
select 1 as emp_id,'Sick Leave' as code , 10 as net_entitlement from dual
union
select 2 as emp_id,'Privilege Leave' as code , 5 as net_entitlement from dual
union
SELECT 3 AS EMP_ID,'Sick Leave' AS CODE , 6 AS NET_ENTITLEMENT FROM DUAL
UNION
SELECT 4 AS EMP_ID,'Sick Leave' AS CODE , 6 AS NET_ENTITLEMENT FROM DUAL
)
select a.emp_id,a.code,
a.net_entitlement
from present_day a,
YESTER_DAY B
WHERE A.EMP_ID=B.EMP_ID
AND A.CODE=B.CODE
and a.net_entitlement<>b.net_entitlement
所需输出为:
emp_id code net_entitlement
1 Sick Leave 9
3 Sick Leave 5
4 Sick Leave 6
5 Sick Leave 10
我尝试使用Union,但如果我使用:-
UNION
select a.emp_id,a.code,
a.net_entitlement
from present_day a,
YESTER_DAY B
WHERE A.EMP_ID NOT IN B.EMP_ID
or B.EMP_ID NOT IN A.EMP_ID;
您可以尝试一些未经测试的方法:
select a.* from
from present_day a
left join YESTER_DAY B
on A.EMP_ID=B.EMP_ID
AND A.CODE=B.CODE
where a.net_entitlement<>coalesce(b.net_entitlement,-1)
union all
select b.*
from present_day a
right join YESTER_DAY B
on A.EMP_ID=B.EMP_ID
AND A.CODE=B.CODE
where coalesce(a.net_entitlement,-1)<>b.net_entitlement
与Lennart的想法相同,或者至少是他的答案的第一个版本,但您还需要合并选择列表中的值:
...
select coalesce(a.emp_id, b.emp_id) as emp_id,
coalesce(a.code, b.code) as code,
coalesce(a.net_entitlement, b.net_entitlement) as net_entitlement
from present_day a
full outer join yester_day b
on a.emp_id = b.emp_id
and a.code = b.code
where a.net_entitlement is null
or b.net_entitlement is null
or a.net_entitlement <> b.net_entitlement;
EMP_ID CODE NET_ENTITLEMENT
---------- --------------- ---------------
1 Sick Leave 9
3 Sick Leave 5
4 Sick Leave 6
5 Sick Leave 10
完全外部联接包括一个或两个表中的记录;where子句不包括两者中具有相同权利净值的项目。我更喜欢显式地检查null,而不是依赖于一个幻数,即使-1在这里看起来很安全。@Alex解决方案更好,请坚持使用该方案。不管怎样,我还是不谈这个。对于记录超过100100行的表来说,它花费了太多的时间,应该仍然是微不足道的;数千人也应该如此。您的实际表中有多少行,它们是否都在emp_id、code上建立索引?你可能需要看一下执行计划,看看它在做什么,如果它没有使用你期望的索引,你会看到它。我从一个有10天历史的存档表中获取。。。。。。需要11分钟才能完全执行@AlexPoole@user3809240-您需要查看执行计划,看看它是否在做意外的事情。对不起,我没有理解执行计划的含义?以什么方式?
...
select coalesce(a.emp_id, b.emp_id) as emp_id,
coalesce(a.code, b.code) as code,
coalesce(a.net_entitlement, b.net_entitlement) as net_entitlement
from present_day a
full outer join yester_day b
on a.emp_id = b.emp_id
and a.code = b.code
where a.net_entitlement is null
or b.net_entitlement is null
or a.net_entitlement <> b.net_entitlement;
EMP_ID CODE NET_ENTITLEMENT
---------- --------------- ---------------
1 Sick Leave 9
3 Sick Leave 5
4 Sick Leave 6
5 Sick Leave 10