1

SQL Server 2008 и выше.Не удалось найти решение или обходное решение

Предположим, у меня есть таблица базы данных с именем «Учителя», которая содержит «Сведения о учителях» в школе и другую таблицу с названием «Расписания», в которой содержатся их расписания. Иногда, если мне требуется автоматически назначать несколько часов учителю/преподавателям в определенный день случайным образом, например, когда один учитель отсутствует, другой учитель может принять это доступное время.

Как здесь:

Declare @hrs numeric(24, 6) = 3 

SELECT T_Code 
FROM Teachers 
LEFT JOIN Schedules S 
WHERE (SELECT 8 - ISNULL(SUM(S_HOURS),0) AS AVLHRS 
     FROM Schedules 
     WHERE S_Teacher = S.S_Teacher) < @hrs 
ORDER BY ISNULL(S_HOURS,0), NEWID() 

Но проблема здесь заключается в том, что только те преподаватели, которые запланированы рассчитываются таким образом я не получаю список всех учителей, доступных. Предположим, что у меня есть новый учитель, который даже не запланирован, также хотите заказать его в порядке, оставшемся от этого учителя. Тогда это не покажет, что Учитель, но я также хочу, чтобы этот учитель был замечен. Я не могу найти работу.

PS. Это не полный код, и он проверяет многие другие условия, но это единственное условие, вызывающее проблему, и я не могу показать полный код.

+0

Я предполагаю, что новые учителя дона» t есть расписание. Если это так, вы отфильтровываете их из-за '(INNER) JOIN' – Nebi

+0

. Они отфильтровываются даже с левым соединением из-за подзапроса –

ответ

1

Чтобы показать всех учителей, есть ли у них график, вы должны использовать ЛЕВЫЙ ПРИСОЕДИНЕНИЕ. LEFT JOIN отображает все данные левой таблицы (в ваших преподавателях), даже если у нее нет значения в правой таблице (в ваших расписаниях).

В коде это выглядит следующим образом:

SELECT T_Code from Teachers LEFT JOIN Schedules S 
WHERE (SELECT 8 - ISNULL(SUM(S_HOURS),0) AS AVLHRS 
FROM Schedules WHERE S_Teacher = S.S_Teacher) < @hrs 
ORDER BY ISNULL(S_HOURS,0), NEWID() 
+0

Пробовали левое соединение, но проблема осталась внутри подзапроса, а не самого соединения –

2

Используйте LEFT JOIN это приблизит все записи Учитель

SELECT T_Code 
FROM Teachers 
LEFT JOIN Schedules S ON Teachers.ID = S.TeacherID 
AND (SELECT 8 - ISNULL(SUM(S_HOURS),0) AS AVLHRS 
     FROM Schedules 
     WHERE S_Teacher = S.S_Teacher) < @hrs 
ORDER BY ISNULL(S_HOURS,0), NEWID() 

Обновлено:

SELECT T_Code, 
     ISNULL(TmpTable.AVLHRS,0) AVLHRS 
FROM Teachers 
LEFT JOIN Schedules S ON Teachers.ID = S.TeacherID 
OUTER APPLY(
    SELECT 8 - ISNULL(SUM(S_HOURS),0) AS AVLHRS 
    FROM Schedules 
    WHERE S_Teacher = S.S_Teacher 
)TmpTable 
WHERE TmpTable.AVLHRS < @hrs 
ORDER BY AVLHRS 
+0

Пробовала левую но проблема лежит внутри подзапроса, а не самого соединения. –

+1

Пробовали ли вы точный запрос, нет предложения где вообще –

+0

Пробовал. Благодарю. Работал. –