SQL сервер покинул соединение, не возвращая ожидаемые записи из левой таблицы - PullRequest
0 голосов
/ 25 июня 2018

У меня есть два объекта в базе данных SQl Server 2008 R2, которые я пытаюсь объединить вместе с левым соединением, но не могу получить левое соединение, чтобы вернуть все записи из таблицы.

  • 1 таблица - tt_activityoccurrence
  • 1 просмотр - vw_academicweeks

vw_academicweeks - это представление, которое содержит для каждого учебного года номер недели, а также первый день и последний день недели и содержит 52 записи для каждого учебного года.

tt_activityoccurrence - это таблица, в которой содержатся уроки в течение года, уроки не будут проходить во все 52 недели года.

В моем запросе я пытаюсь вернуть все экземпляры из представления vw_academicweeks, чтобы получить следующую информацию

+------------+------------+------------+------------+---------+
| ActivityID | WeekStart  | StartTime  |  EndTime   | week_no |
+------------+------------+------------+------------+---------+
|      59936 | 04/09/2017 | 05/09/2017 | 05/09/2017 |       6 |
|      59936 | 11/09/2017 | 12/09/2017 | 12/09/2017 |       7 |
|      59936 | 18/09/2017 | 19/09/2017 | 19/09/2017 |       8 |
|      59936 | 25/09/2017 | 26/09/2017 | 26/09/2017 |       9 |
|      59936 | 02/10/2017 | 03/10/2017 | 03/10/2017 |      10 |
|      59936 | 09/10/2017 | 10/10/2017 | 10/10/2017 |      11 |
|      59936 | 16/10/2017 | 17/10/2017 | 17/10/2017 |      12 |
|      59936 | Null       | Null       | Null       |      13 |
|      59936 | 30/10/2017 | 31/10/2017 | 31/10/2017 |      14 |
|      59936 | 06/11/2017 | 07/11/2017 | 07/11/2017 |      15 |
|      59936 | 13/11/2017 | 14/11/2017 | 14/11/2017 |      16 |
|      59936 | 20/11/2017 | 21/11/2017 | 21/11/2017 |      17 |
|      59936 | 27/11/2017 | 28/11/2017 | 28/11/2017 |      18 |
|      59936 | 04/12/2017 | 05/12/2017 | 05/12/2017 |      19 |
|      59936 | 11/12/2017 | 12/12/2017 | 12/12/2017 |      20 |
|      59936 | 18/12/2017 | 19/12/2017 | 19/12/2017 |      21 |
|      59936 | Null       | Null       | Null       |      22 |
|      59936 | Null       | Null       | Null       |      23 |
+------------+------------+------------+------------+---------+

При левом соединении я могу вернуть все значения, кроме нулей, так что в столбце week_no отсутствуют строки 13,22 и 23. Я также пробовал это с внешним соединением, но получил ту же информацию.

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

select 
    ttao.ActivityID
    ,dateadd(dd,datediff(dd,0,DATEADD(dd, -(DATEPART(dw, ttao.StartTime)-1), ttao.StartTime)),0) WeekStart
    ,ttao.StartTime
    ,ttao.EndTime
    ,aw.week_no

from

vw_AcademicWeeks AW
left join TT_ActivityOccurrence TTAO on
(dateadd(dd,datediff(dd,0,DATEADD(dd, -(DATEPART(dw, ttao.StartTime)-1), ttao.StartTime)),0))=aw.ay_start
where 

ay_code='1718' and
TTAO.ActivityID='59936'

order by aw.week_no asc

1 Ответ

0 голосов
/ 25 июня 2018

Предложение where делает его inner join, удаляя строки вне области вашего соединения . Вы должны перенести эту логику в оператор объединения. Обратите внимание, я не проверял ваше условие присоединения (логика dateadd ... datediff)

select 
    ttao.ActivityID
    ,dateadd(dd,datediff(dd,0,DATEADD(dd, -(DATEPART(dw, ttao.StartTime)-1), ttao.StartTime)),0) WeekStart
    ,ttao.StartTime
    ,ttao.EndTime
    ,aw.week_no    
from    
vw_AcademicWeeks AW
left join TT_ActivityOccurrence TTAO on
    (dateadd(dd,datediff(dd,0,DATEADD(dd, -(DATEPART(dw, ttao.StartTime)-1), ttao.StartTime)),0)) = aw.ay_start
    and ay_code='1718' 
    and TTAO.ActivityID='59936'    
order by aw.week_no asc
...