Eu tenho uma tabela pai Orders
e uma tabela Filho Jobs
com os seguintes dados de exemplo
Eu quero selecionar Ordens com base nos seguintes requisitos
1>Para cada ordem pode ser 0 ou mais postos de trabalho. Não selecionar a ordem se de não ter qualquer trabalho.
2>Um usuário não pode trabalhar em mais do que um trabalho que pertence à mesma ordem.
Por exemplo Usuário 1
não pode trabalhar em Empregos que pertence à Ordem 1 e 2, porque ele já trabalhou em empregos 1
e 4
da mesma encomenda.
3>selecione Somente as ordens que têm empregos em Requested
estado
Eu tenho a seguinte consulta que me dá o resultado esperado
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
Associações de consulta a Jobs
a tabela duas vezes. Eu estou tentando otimizar a consulta e procurando uma maneira de atingir o resultado esperado usando Jobs
tabela apenas uma vez, se possível. Qualquer outra solução também é apreciado. Eu posso alterar o esquema da tabela, se necessário.
A tabela de tarefas tem quase 20M de linhas e algum tempo de consulta mostra um desempenho ruim. (Sim, nós olhamos índices). Eu acho os seus trabalhos de digitalização de mesa duas vezes causando o problema de desempenho.
ID
do tipo int. Apenas para a compreensão do propósito eu guardei, como nvarchar