#sql #sql-server #tsql #case-statement
#sql #sql-сервер #tsql #case-оператор
Вопрос:
Я пытаюсь сделать что-то подобное…
SELECT lc.Location, count(h.empID) as 'Count', lu.LBL
FROM swam.lookup lu
LEFT JOIN swam.empTable h
ON CASE
WHEN lu.sac is null
THEN lu.POS = h.POS
ELSE (
lu.POS = h.POS
and
lu.sac = h.sac)
INNER JOIN swam.Locations lc
ON h.LocationID = lc.LocationID
GROUP BY lc.Location, lu.LBL
ORDER BY lc.Location
Итак, если lu.sac имеет значение null, тогда объединяйте таблицы только в одном общем столбце.
Если оно не равно null, то для объединения необходимо использовать как POS, так и SAC.
Возможно ли это?
Ответ №1:
Не используйте case
. Просто используйте прямую логическую логику:
FROM swam.lookup lu LEFT JOIN
swam.empTable h
ON lu.POS = h.POS AND
(lu.sac is null OR lu.sac = h.sac) INNER JOIN
swam.Locations fs
ON h.LocationID = lc.LocationID
В качестве бонуса компонент database Engine также может использовать преимущество индекса pos
в любой (или обеих) таблицах.
Комментарии:
1. Есть ли какое-либо снижение производительности, когда мы ставим условие OR в Join или Условие Where в SQL Server, т.Е. Не подлежащий обработке запрос? См. Ссылку ниже:- en.wikipedia.org/wiki/Sargable
2. @RGS . . . Если в противном случае запрос будет использовать индексы, то, вероятно, произойдет снижение производительности.
Ответ №2:
SELECT lc.Location, count(h.empID) as 'Count', lu.LBL
FROM swam.lookup lu
LEFT JOIN swam.empTable h
ON (lu.sac is null AND lu.POS = h.POS) OR
not(lu.sac is null) AND lu.POS = h.POS and lu.sac = h.sac
INNER JOIN swam.Locations fs
ON h.LocationID = lc.LocationID
GROUP BY lc.Location, lu.LBL
ORDER BY lc.Location
Ответ №3:
SELECT lc.Location, count(h.empID) as 'Count', lu.LBL
FROM swam.lookup lu
LEFT JOIN swam.empTable h
ON lu.POS = h.POS
AND isnull(lu.sac, h.sac) = h.sac
INNER JOIN swam.Locations fs
ON h.LocationID = lc.LocationID // this looks wrong lc is not defined
GROUP BY lc.Location, lu.LBL
ORDER BY lc.Location
и я думаю, что последнее соединение превратит вступление в левое соединение и внутреннее соединение
Комментарии:
1. мой плохой, lc должен быть lu
2. мой плохой. fs должен был быть lc