Обращение в «ON» caluse соединения

#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