2017-06-30 2 views
0

Ich habe einige Datensätze in ang1 zu finden:Um Teilmenge von Daten in Oracle

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 ; 

und einige Datensätze in 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 
) 

rowcount von emp: 205001 rowcount von ang1: 18003

Ich möchte herausfinden, ob emp alle Datensätze von emp1 hat, mit anderen Worten, wenn emp ist superset von emp1. Ich habe versucht, diese:

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 ; 

Rowcount für die obige Abfrage: 12360. So habe ich festgestellt, dass emp keine Obermenge von ang1 ist

Jemand lassen Sie es mich wissen, was ich getan habe, ist in Ordnung oder es braucht etwas Modifikation. Teilen Sie uns bitte auch mit, wenn Sie etwas Besseres wissen.

Dank

Antwort

2

Sie die korrelierte Unterabfragen vermeiden könnte und tun nur einen einfachen Satz MINUS Betrieb:

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 

Sie auch eine LEFT JOIN verwenden:

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

Die Leistung hängt auf Faktoren wie Indizes, Datenvolumen. Die Überprüfung der Abfragepläne und des Benchmarks geben Ihnen eine gute Vorstellung davon, welche die bessere Option ist.

+1

Ich mag Anti-Joins nicht so sehr. Ich finde sie weniger lesbar als die geradlinigen 'NOT EXIST' und' NOT IN'. Ich vermute, das ist der Grund, warum Sie die beiden Tabellen in der zweiten Abfrage verwechselt haben :-) Wie auch immer, von allen Methoden finde ich 'MINUS' am saubersten, und es wäre auch meine erste Annäherung. –

Verwandte Themen