Tengo una tabla primaria Orders
y un Niño de mesa Jobs
con los siguientes datos de ejemplo
Quiero seleccionar Pedidos en base a los siguientes requisitos
1>Para cada orden puede ser 0 o más puestos de trabajo. No seleccione la orden, si no tiene ningún tipo de trabajo.
2>Un usuario puede trabajar en más de un trabajo que pertenece a la misma orden.
Por ejemplo, el Usuario 1
no puede trabajar en los Puestos de trabajo que pertenece a la Orden 1 y 2 porque él ya ha trabajado en puestos de trabajo 1
y 4
de la misma orden.
3>seleccionar Sólo los pedidos que tienen puestos de trabajo en Requested
estado
Tengo la siguiente consulta, que me da el 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
La consulta se une a la Jobs
tabla dos veces. Estoy tratando de optimizar la consulta y busca una manera de lograr el resultado esperado por el uso de Jobs
tabla sólo una vez si es posible. Cualquier otra solución también es apreciado. Me pueden alterar el esquema de la tabla si es necesario.
La tabla de trabajos tiene casi 20 millones de filas y algunas de las consultas en tiempo muestra un rendimiento deficiente. (Sí, nos fijamos en los índices). Creo que sus trabajos de escaneo de la tabla dos veces causando el problema de rendimiento.
ID
de tipo int. Sólo para la comprensión del propósito me la guardé como nvarchar