繁体   English   中英

在Oracle中查找数据子集

[英]To find subset of data in Oracle

我在emp1中有一些记录:

SELECT distinct 
substrb(emp.employee_NAME,1,50) employee_NAME 
FROM employee emp , employee_sites sites , (SELECT DISTINCT employee_id ,
emp_site_number
FROM abc
) abc
where emp.employee_id = sites.employee_id
and abc.employee_id=emp.employee_id
and abc.emp_site_number = sites.emp_site_number ;

以及emp中的一些记录:

SELECT  distinct emp.employee_NAME employee_NAME 
FROM employee emp
WHERE 1=1 and EXISTS
(SELECT 1 FROM employee_ACCOUNTS acc WHERE acc.employee_id = emp.employee_id
) 

emp的行数:205001 emp1的行数:18003

我想找出emp是否具有emp1的所有记录,换句话说,如果emp是emp1的超集。 我尝试了这个:

select count(*)  from (SELECT  distinct emp.employee_NAME employee_NAME 
FROM employee emp
WHERE 1=1 and EXISTS
(SELECT 1 FROM employee_ACCOUNTS acc WHERE acc.employee_id = emp.employee_id
) ) emp ,
(SELECT distinct 
substrb(emp.employee_NAME,1,50) employee_NAME 
FROM employee emp , employee_sites sites , (SELECT DISTINCT employee_id ,
emp_site_number
FROM abc
) abc
where emp.employee_id = sites.employee_id
and abc.employee_id=emp.employee_id
and abc.emp_site_number = sites.emp_site_number)  emp1
where emp.employee_NAME = emp1.employee_NAME ;

以上查询的行数:12360。因此,我得出的结论是emp不是emp1的超集

有人请让我知道我做的很好,或者需要修改。 如果您知道更好的方法,也请分享。

谢谢

您可以避免相关的子查询,而只需进行简单的MINUS设置即可:

select employee_name -- or whatever makes the employee the same in 2 tables
from emp1 -- the table which may have rows not in the other table

MINUS

select employee_name
from emp2 -- the table which you think may be missing some rows

您还可以使用左联接:

select emp2.employee_name from emp2
left join emp1 on emp2.employee_name = emp1.employee_name
where emp1.employee_name is null

性能将取决于诸如索引,数据量之类的因素。 检查查询计划和基准测试将使您更好地了解哪个是更好的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM