Когда вы ПРИСОЕДИНЯЕТЕСЬ, вы получаете частичное декартово произведение.Частичное происходит из условия INNER JOIN.
Таким образом, для 2 строк в EM, которые имеют 3 строки и 4 строки в PR соответственно, вы получите 7 строк в выходных данных.Как и ожидалось.Вы попросили «дать мне все частичные декартовы произведения EM и PR, где совпадают строки»
Однако вы хотите «дать мне строки в EM, где есть что-то в PR».Таким образом, INNER JOIN - неправильная конструкция.
Вы можете использовать IN, EXISTS (или INTERSECT в других ситуациях), и все они семантически правильны для этого последнего вопроса.
В этом случае вы используете IN не в том месте.Как я уже говорил, все условие «test» должно быть помещено в подзапрос.
Итак, оба они верны
- Одна таблица в предложении FROM
- Все условия в подзапросе
- Нет DISTINCT
Прекратить присоединение!
select
EM.Employee, rtrim(EM.FirstName) + ' ' + rtrim(EM.LastName) as Name
from
EM EM
WHERE
EXISTS (SELECT *
FROM
PR PR
JOIN
TabFields TF ON PR.WTS1 = TF.WTS1
WHERE
PR.WTS2 = '' AND
TF.custInclude = 'Y' and TF.WBT2 = '' AND
EM.Employee = PR.ProjMgr
)
select
EM.Employee, rtrim(EM.FirstName) + ' ' + rtrim(EM.LastName) as Name
from
EM EM
WHERE
EM.Employee IN (SELECT PR.ProjMgr
FROM
PR PR
JOIN
TabFields TF ON PR.WTS1 = TF.WTS1
WHERE
PR.WTS2 = '' AND
TF.custInclude = 'Y' and TF.WBT2 = ''
)
Использование 2 входов, что ближе к вашему исходному запросу:
select EM.Employee,
rtrim(EM.FirstName) + ' ' + rtrim(EM.LastName) as Name
from EM EM
WHERE
EM.Employee IN (SELECT PR.ProjMgr
FROM
PR PR
where PR.WTS1 in (Select distinct WTS1
from TabFields
where custInclude = 'Y' and WTS2 = '')
and PR.WTS2 = ''
)
order by Name