У меня есть родительская таблица Orders
и Детский столик Jobs
со следующими образцами данных
Я хочу отбирать заказы на основе следующих требований
1>Для каждого заказа может быть 0 или более заданий. Не выбирайте заказ, если в нем нет никакого задания.
2>Пользователь не может работать более чем над одним заданием, принадлежащим одному и тому же заказу.
Например Пользователь 1
не может работать на заданиях, относящихся к заказам 1 и 2, потому что он уже работал на заданиях 1
и 4
из того же заказа.
3>Выбирайте только заказы, в которых есть задания в Requested
Статус
У меня есть следующий запрос, который дает мне ожидаемый результат
DECLARE @UserID INT = 2
SELECT O.OrderID
FROM Orders O
JOIN Jobs J ON J.OrderID = O.OrderID
WHERE
J.JobStatus = 'Requested' AND
NOT EXISTS
(
--Must not have worked this Order
SELECT 1 FROM Jobs J1
WHERE J1.OrderID = O.OrderID AND J1.UserID = @UserID
)
Group By o.OrderID
Запрос присоединяется к Jobs
столик дважды. Я пытаюсь оптимизировать запрос и ищу способ достичь ожидаемого результата с помощью Jobs
таблица только один раз, если это возможно. Любое другое решение также приветствуется. При необходимости я могу изменить схему таблицы.
Таблица заданий содержит почти 20 млн строк, и некоторые запросы времени показывают низкую производительность. (Да, мы смотрели на индексы). Я думаю, что его таблица заданий сканирования дважды вызывает проблемы с производительностью.
ID
типа int. Просто для понимания цели я сохранил его как нварчар