Som rodič tabuľka Orders
a Dieťa tabuľka Jobs
s ukážkových dát
Chcem vyberte Objednávky na základe nasledujúcich požiadaviek
1>Pri každej objednávke môže byť 0 alebo viac pracovných miest. Nevyberajte objednávke, ak to nemá žiadnu prácu.
2>používateľ nemôže pracovať na viac ako jednu prácu, ktorá patrí k jednej objednávke.
Napríklad Používateľ 1
nemôže pracovať na pracovných Miest, ktoré patrí na Objednávku 1 a 2, pretože on už pracoval na zamestnanosť 1
a 4
od rovnakom poradí.
3>vybrať Iba objednávky, ktoré majú pracovných miest v Requested
stav
Mám tieto dotaz, ktorý mi dáva očakávaný výsledok
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
Dotaz pripojí Jobs
tabuľky dvakrát. Ja som snaží optimalizovať dotaz a hľadá spôsob, ako dosiahnuť očakávaný výsledok, pomocou Jobs
tabuľka len raz, ak je to možné. Akékoľvek iné riešenie je tiež ocenili. Môžem zmeniť tabuľky, schémy, ak je to potrebné.
Pracovných miest tabuľka má takmer 20M riadkov a nejaký čas dotaz ukazuje zlý výkon. (Áno, sme sa zamerali na indexy). Myslím, že jeho skenovanie pracovných miest tabuľky dvakrát spôsobuje výkonu problém.
ID
typu int. Len pre pochopenie účelu stále som to ako nvarchar