SQL-запрос для возврата несопоставимых строк из двух таблиц

#sql #sql-server #sql-server-2012

#sql #sql-server #sql-server-2012

Вопрос:

У меня есть 2 таблицы tblEmp1 и tblEmp2, из которых мне нужно извлечь не совпадающие строки tblEmp1 путем сравнения tblEmp2.

выберите * из 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
  

выберите * из 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, у меня есть соответствующие salary1 и salary2 с DOJ = ‘2016-12-31’.

Мое требование заключается в том, что я должен извлекать только те записи из первой таблицы, которые отсутствуют в таблице tblEmp2 для DFeptID = 3 и DOJ = ‘2016-12-31’, т.Е. Мой запрос должен возвращать конечные 2 строки из таблицы tblEmp1

 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’

Это то, что я использовал до сих пор

 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
  

ВАЖНО: я забыл упомянуть, что таблицу tblEmp2 мне тоже нужно фильтровать на основе DeptName … т.Е. tblEmp1.DeptID = 3, tblEmp2.DeptName = ‘XYZ’ и tblEmp1.DOJ = ‘2016-12-31’ должно быть условием поиска / фильтрации.

Комментарии:

1. Какой столбец является вашей базой для сравнения? MngrId, TempID или что?

2. ОБА, ЕСЛИ КАКОЙ-ЛИБО ИЗ НИХ ОТЛИЧАЕТСЯ

Ответ №1:

 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
  

Ответ №2:

Попробуйте использовать приведенный ниже сценарий. Измените ‘,’ в вашем условии on с помощью оператора 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' 
  

Комментарии:

1. В чем разница в ожидаемом выходе и результате приведенного выше запроса?

2. Вы должны включить условие ‘tblEmp2.DeptName = ‘XYZ’ ‘ в предложение on левого соединения.. Если вы включите его в условие where, оно будет действовать как внутреннее соединение..

Ответ №3:

Я запускаю это:

 ;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
  

Именно те строки, которые вам нужны, почти такой же запрос, как вы публикуете. В чем, по-видимому, проблема?