#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
Именно те строки, которые вам нужны, почти такой же запрос, как вы публикуете. В чем, по-видимому, проблема?