Проблема с SQL Join - PullRequest
       10

Проблема с SQL Join

0 голосов
/ 06 января 2009

У меня есть две таблицы: tblEntities и tblScheduling.

tblEntities:

EntityID  ShortName          Active
1         Dirtville          1
2         Goldtown           1
3         Blackston          0
4         Cornfelt           1
5         Vick               1

tblScheduling:

ScheduleID EntityID SchedulingYearID
1          1        20
2          1        21
3          2        20
4          3        19
5          5        20

Мне нужен запрос, который покажет ALL ACTIVE Объекты и информацию о их расписании для определенного ScheduleYearID.

Выходные данные должны выглядеть следующим образом (в данном случае желаемый SchedulingYearID равен 20):

EntityID ScheduleID
1        1
2        3
4        NULL
5        5

Запрос, который я написал до сих пор:

SELECT     tblEntities.EntityID, tblEntities.ShortName, tblScheduling.ScheduleID
FROM         tblScheduling RIGHT OUTER JOIN
                      tblEntities ON tblScheduling.EntityID = tblEntities.EntityID
WHERE     (tblScheduling.SchedulingYearID = @SchedulingYearID) 
AND (tblEntities.Active = 1)
ORDER BY tblEntities.EntityID

Моя проблема заключается в том, что при использовании этого запроса он не будет включать активные объекты без информации о расписании (например, EntityID 4 в приведенном выше примере). Я могу написать запрос для отображения всех активных объектов и их состояния расписания, но как только я начну ограничивать его через SchedulingYearID, я потеряю эти конкретные объекты.

Существуют ли какие-либо решения, которые я, очевидно, упускаю, не прибегая к подзапросам, курсорам и т. Д.? Если нет, то это не имеет большого значения, я просто чувствую, что упускаю что-то простое здесь.

Ответы [ 3 ]

6 голосов
/ 06 января 2009

Попробуйте это ... Условия соединения оцениваются для получения промежуточного набора результатов Соединения, а затем (для внешнего соединения) все строки со стороны "Внешняя" добавляются обратно, прежде чем двигаться дальше ... Где условия оцениваются после выполнения всех соединений ...

SELECT E.EntityID, E.ShortName, S.ScheduleID
FROM  tblEntities E 
     Left Join tblScheduling S 
        ON S.EntityID = E.EntityID
           And S.SchedulingYearID = @SchedulingYearID 
WHERE E.Active = 1
ORDER BY E.EntityID

Я изменяю ваш порядок соединения, потому что я предпочитаю левые соединения ... но это не имеет значения

0 голосов
/ 06 января 2009

Мне кажется, проблема в том, что предложение WHERE отфильтровывает строки, в которых SchedulingYearID равен нулю. Так что не надо.

SELECT tblEntities.EntityID, tblEntities.ShortName, tblScheduling.ScheduleID
    FROM tblScheduling RIGHT OUTER JOIN
         tblEntities ON tblScheduling.EntityID = tblEntities.EntityID
    WHERE (tblScheduling.SchedulingYearID = @SchedulingYearID OR
           tblScheduling.SchedulingYearID IS NULL) 
      AND (tblEntities.Active = 1)
    ORDER BY tblEntities.EntityID;
0 голосов
/ 06 января 2009

Это ваши условия в предложении where: (tblScheduling.SchedulingYearID = @SchedulingYearID)

когда нет информации tblScheduling, это всегда будет неудачным. Добавить

(((tblScheduling.SchedulingYearID = @SchedulingYearID) ИЛИ (tblScheduling.SchedulingYearID имеет значение null))

или проверка нулевого состояния вашей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...