2016-10-01 117 views
0

我有2个表tblEmp1和tblEmp2,我需要通过比较tblEmp2来提取tblEmp1的非匹配行。SQL查询返回来自两个表的不匹配的行

SELECT * FROM tblEmp1

EmpMasterID  DeptID MngrID  TEMPID  Salary1   Salary2   DOJ   
46    3  995   559   1000000000  1000000000  2016-12-31  
47    3  999   556   2500000000  2500000000  2016-12-31  
48    3  994   165   1500000000  1500000000  2016-12-31   
49    3  998   566   7500000000  7500000000  2016-12-31   
50    3  1049  562   9500000000  9500000000  2016-12-31 

SELECT * FROM tblEmp2

EmpID DeptName DeptID MngrID TEMPID  Salary1   Salary2   DOJ       
84  XYZ   3  994  165   1500000000  1500000000  2016-12-31 
85  XYZ   3  995  559   1000000000  1000000000  2016-12-31  
86  XYZ   3  999  556   2500000000  2500000000  2016-12-31 

大家都可以看到上面的DEPTID = 3,MngrID = 994,995,999和TempID = 165,559 ,556我拥有与DOJ ='2016-12-31'相匹配的salary1和salary2。

我的要求是我应该只提取从第一个表中不存在的tblEmp2表的记录DFeptID = 3和DOJ =“2016年12月31日” 即我的查询应该从tblEmp1返回结束2行表

EmpMasterID  DeptID MngrID  TEMPID  Salary1   Salary2   DOJ      
49    3  998   566   7500000000  7500000000  2016-12-31   
50    3  1049  562   9500000000  9500000000  2016-12-31 

因为它们不存在在tblEmp2表,其中DEPTID = 3和DOJ = '2016年12月31日'

这就是我TRID至今

select t1.EmpMasterID, t1.DeptID, t1.MngrID, t1.TEMPID, t1.Salary1, t1.Salary2, t1.DOJ 
from tblEmp1 as t1 
left outer join tblEmp2 as t2 
on t1.DeptID = t2.DeptID, t1.MngrID = t2.MngrID, t1.TEMPID = t2.TEMPID, t1.DOJ = t2.DOJ 
where t1.DeptID = 3 and t1.DOJ = '2016-12-31' and t2.MngrID is null and t2.TEMPID is null 

重要提示:我忘了提及我需要基于DeptName过滤tblEmp2表...即,tblEmp1.DeptID = 3,tblEmp2.DeptName ='XYZ'和tblEmp1.DOJ ='2016-12-31'should成为搜索/过滤条件。

+0

哪一列是您比较的基础? MngrId,TempID还是什么? –

+0

两者,如果有一个是不同的 – Amar

回答

0

请尝试使用下面的脚本。用AND运算符改变','的条件。

SELECT t1.EmpMasterID, t1.DeptID, t1.MngrID, t1.TEMPID, t1.Salary1, t1.Salary2, t1.DOJ 
    FROM tblEmp1 as t1 
     left outer join tblEmp2 as t2 
      on t1.DeptID = t2.DeptID and t1.MngrID = t2.MngrID and t1.TEMPID = t2.TEMPID and t1.DOJ = t2.DOJ 
      AND t2.DeptName = 'XYZ' -- AND t1.Salary1=t2.Salary1 AND t1.Salary2=t2.Salary2 --(include these columns if you wanted to compare salary) 
    WHERE t1.DeptID = 3 and t1.DOJ = '2016-12-31' 
     and t2.DeptId is null 

或使用NOT EXISTS ..

SELECT t1.EmpMasterID, t1.DeptID, t1.MngrID, t1.TEMPID, t1.Salary1, t1.Salary2, t1.DOJ 
    FROM tblEmp1 as t1 
     WHERE NOT EXISTS(SELECT 1 
         FROM tblEmp2 as t2 
         WHERE t1.DeptID = t2.DeptID and t1.MngrID = t2.MngrID and t1.TEMPID = t2.TEMPID and t1.DOJ = t2.DOJ 
          -- AND t1.Salary1=t2.Salary1 AND t1.Salary2=t2.Salary2 --(include these columns if you wanted to compare salary) 
           ) 
     AND t1.DeptID = 3 and t1.DOJ = '2016-12-31' 
+0

不能正常工作.... – Amar

+0

预期输出和上述查询结果有什么不同? –

+0

您必须在左连接的on子句中包含条件'tblEmp2.DeptName ='XYZ'''。如果将其包含在where条件中,它将充当内连接。 –

0
select * 
from tblEmp1 t1 
join (

    select DeptID, MngrID, TempID 
    from tblEmp1 
except 
    select DeptID, MngrID, TempID 
    from tblEmp2 
) t2 on t1.DeptId = t2.DeptId and t1. MngrId = t2.MngrId and t1.TempID = t2.TempID 
+0

Not Working .... – Amar

0

我运行此:

;WITH tblEmp1 AS (
SELECT * 
FROM (VALUES 
(46,    3,  995,   559,   1000000000,  1000000000,  '2016-12-31'), 
(47,    3,  999,   556,   2500000000,  2500000000,  '2016-12-31'), 
(48,    3,  994,   165,   1500000000,  1500000000,  '2016-12-31'),  
(49,    3,  998,   566,   7500000000,  7500000000,  '2016-12-31'), 
(50,    3,  1049,  562,   9500000000,  9500000000,  '2016-12-31') 
) as t(EmpMasterID,DeptID,MngrID,TEMPID,Salary1,Salary2,DOJ) 
), tblEmp2 AS (
SELECT * 
FROM (VALUES 
(84,  'XYZ',   3,  994,  165,   1500000000,  1500000000,  '2016-12-31'), 
(85,  'XYZ',   3,  995,  559,   1000000000,  1000000000,  '2016-12-31'), 
(86,  'XYZ',   3,  999,  556,   2500000000,  2500000000,  '2016-12-31') 
) as t(EmpID,DeptName,DeptID,MngrID,TEMPID,Salary1,Salary2,DOJ) 
) 

SELECT e1.* 
FROM tblEmp1 e1 
LEFT JOIN tblEmp2 e2 
    ON e1.DeptID = e2.DeptID 
     AND e1.MngrID = e2.MngrID 
     AND e1.TEMPID = e2.TEMPID 
     AND e1.DOJ = e2.DOJ 
where e1.DeptID = 3 and e1.DOJ = '2016-12-31' 
    AND e2.MngrID IS NULL AND e2.TEMPID IS NULL 

而得到这样的:

EmpMasterID DeptID MngrID TEMPID Salary1  Salary2  DOJ 
49   3  998  566  7500000000 7500000000 2016-12-31 
50   3  1049 562  9500000000 9500000000 2016-12-31 

准确地说,您需要的行几乎与您发布的查询相同。假设是一个问题?

相关问题