Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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 在Oracle中查找数据子集的步骤_Sql_Oracle - Fatal编程技术网

Sql 在Oracle中查找数据子集的步骤

Sql 在Oracle中查找数据子集的步骤,sql,oracle,Sql,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.e

我在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的超集

有人请让我知道我所做的是好的,或者它需要一些修改。 如果你知道更好的方法,也请分享


谢谢

您可以避免相关的子查询,只需执行一个简单的集减操作:

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

性能将取决于索引、数据量等因素。检查查询计划和基准测试将让您很好地了解哪一个是更好的选择。

您可以避免相关的子查询,只需执行一个简单的集减操作:

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

性能将取决于索引、数据量等因素。检查查询计划和基准测试可以让您很好地了解哪一个是更好的选择。

我不太喜欢反连接。我发现它们的可读性不如直接的
不存在
不存在
。我想这就是为什么您在第二个查询中混淆了这两个表:-)无论如何,在我发现的所有方法中,
减法是最干净的,这也是我的第一种方法。我不太喜欢反联接。我发现它们的可读性不如直接的
不存在
不存在
。我想这就是为什么您在第二个查询中混淆了这两个表:-)无论如何,在我发现的所有方法中,
减法是最干净的,这也是我的第一种方法。