Mám nadřazené tabulky Orders
a Dítě tabulka Jobs
s následující ukázková data
Chci vybrat na základě Objednávky na následující požadavky
1>Pro každou objednávku může být 0 nebo více pracovních míst. Vyberte objednávku, pokud to nemá žádnou práci.
2>uživatel nemůže pracovat na více než jednu práci, která patří do stejné pořadí.
Například Uživatel 1
nemůže pracovat na pracovní Místa, která patří k Pořadí 1 a 2, protože už pracovali na pracovní místa 1
a 4
ze stejné pořadí.
3>vybrat Pouze objednávky, které mají práci v Requested
stav
Mám následující dotaz, který mi dává očekávaný výsledek
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
Dotazu připojí Jobs
stůl dvakrát. Snažím se optimalizovat dotaz a hledá způsob, jak dosáhnout očekávaného výsledku pomocí Jobs
tabulka pouze jednou, pokud je to možné. Jakékoli jiné řešení je také ocenil. Mohu změnit tabulky schématu v případě potřeby.
Míst tabulka má skoro 20M řádky a nějaký čas dotazu ukazuje špatný výkon. (Ano, podívali jsme se na indexy). Myslím, že jeho skenování pracovních míst tabulky dvakrát, což způsobuje problém výkonu.
ID
typu int. Jen pro pochopení účelu pořád jsem to jako nvarchar