Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL查询中两天内找到新记录_Sql_Oracle_Union - Fatal编程技术网

在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