Mam nadrzędny tabela Orders
i stolik dla Dzieci Jobs
z następujących przykładowych danych
Chcę odbierać zamówienia na podstawie następujących wymagań
1>Do każdego zamówienia może być 0 lub więcej zadań. Nie wybieraj zamówienie, jeśli nie ma w nim żadnego zadania.
2>Użytkownik nie może pracować więcej niż nad jednym zadaniem, należących do jednego i tego samego zamówienia.
Na Przykład Użytkownik 1
nie może pracować w zadaniach odnoszących się do zamówień 1 i 2, bo on już pracował na misjach 1
i 4
z tego samego zamówienia.
3>Wybierz tylko zamówienia, w których są zadania w Requested
Status
Mam następujący wniosek, który mi daje oczekiwany wynik
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
Wniosek dołącza do Jobs
stolik dwukrotnie. Staram się optymalizować zapytania i szukam sposobem na osiągnięcie oczekiwanego rezultatu za pomocą Jobs
tabela tylko raz, jeśli to możliwe. Każde inne rozwiązanie również mile widziane. W razie potrzeby mogę zmienić schemat tabeli.
Tabela zadań zawiera prawie 20 mln wierszy, a niektóre wnioski czasu wykazują niską wydajność. (Tak, patrzyliśmy na indeksy). Myślę, że jego tabela zadań skanowania kliknij dwukrotnie powoduje problemy z wydajnością.
ID
typu int. Po prostu dla zrozumienia celu zapisałem go jako нварчар