Bir üst masam var Orders
ve bir Çocuk masası Jobs
aşağıdaki örnek verilerle
Aşağıdaki gereksinimlere göre Siparişleri seçmek istiyorum
1 > Her sipariş için 0 veya daha fazla iş olabilir. Herhangi bir işi yoksa sipariş'i seçmeyin.
2 > Bir kullanıcı aynı sıraya ait birden fazla işte çalışamaz.
Örneğin Kullanıcı 1
zaten işlerde çalıştığı için Sipariş 1 ve 2'ye ait işlerde çalışamaz 1
ve 4
aynı emirden.
3 > Yalnızca içinde iş bulunan siparişleri seçin Requested
durum
Bana beklenen sonucu veren aşağıdaki sorguya sahibim
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
Sorguya katılır Jobs
masa iki kere. Sorguyu optimize etmeye çalışıyorum ve kullanarak beklenen sonucu elde etmenin bir yolunu arıyorum Jobs
mümkünse sadece bir kez masa. Başka herhangi bir çözüm de takdir edilmektedir. Gerekirse tablo şemasını değiştirebilirim.
İşler tablosunda neredeyse 20M satır bulunur ve bir süre sorgusu düşük performans gösterir. (Evet, indekslere baktık). Tarama işleri tablosunun iki kez performans sorununa neden olduğunu düşünüyorum.
ID
int tipi. Sadece anlama amacı için onu nvarchar olarak sakladım