2017-06-21 73 views
1

我想要做的两个表像这些之间的减法运算:用在Oracle SQL固定列选择减

表1:

employee_id | job | sector 
----------- | ------ | ------ 
10   | a  | 1 
10   | a  | 2 
10   | b  | 4 

表2:

job | sector 
---- | ------ 
a | 1 
a | 2 
a | 3 
b | 1 
b | 4 
c | 1 
c | 2 

并且因此我想,对于每个employee_id,{job,sector}在table1中都没有连接。

结果:

employee_id | job | sector 
----------- | --- | ------ 
10   | a | 3 
10   | b | 1 
10   | c | 1 
10   | c | 2 

这可能吗?

我希望我已经写在一个清晰的方式!谢谢!

+0

你怎么'employee_id'如果表没有链接? –

+0

Employee_id是另一个称为Employee的表的FK。 –

回答

1

首先选择完整的数据集,即EMPLOYEE_ID X工作/扇区。从这些中删除现有的table1条目以获取缺少的条目。 (我已经改名为你的表table2job_sector以提高可读性。我还假设你有一个employee表。)

select e.employee_id, js.job, js.sector 
from employee e 
cross join job_sector js 
minus 
select employee_id, job, sector 
from table1; 
+0

是的!有用!谢谢! –

+0

PS:你猜得好,我有'员工'表! –

0

LEFT JOIN,其中T2为空

select t1.* 
from table1 t1 
let join table2 t2 
    on t1.job = t2.job 
    and t1.sector = t2.sector 
where t2.job is null 
0

这听起来似乎只是一个left join(或not innot exists):

select 10 as employee_id, t2.* 
from table2 t2 left join 
    table1 t1 
    on t2.job = t1.job and t2.sector = t1.sector 
where t1.job is null; 

我对你如何获得员工ID有点糊涂如果表格未链接

如果您在t1有多个员工,那么你可以做:

select e.employee_id, t2.* 
from (select distinct employee_id from t1) e cross join 
    table2 t2 left join 
    table1 t1 
    on t2.job = t1.job and t2.sector = t1.sector and 
     e.employee_id = t1.employee_id 
where t1.job is null; 
+0

干得好!我在t1有多个employee_id,你的第二个解决方案工作正常!谢谢! –

0

你可以简单地做一个左加入实现它。您的查询将是这个样子:

SELECT T2.* 
FROM TABLE2 T2 LEFT JOIN 
    TABLE1 T1 
    ON T2.JOB = T1.JOB AND T2.SECTOR = T2.SECTOR 
WHERE T1.JOB IS NULL; 

虽然表必须以获得员工ID链接。