我將能夠提供更好的查詢,但需要澄清。您的查詢部分
AND ClassId IN (SELECT MAX(ClassId)
FROM dbo.tbl
WHERE ClassId IN
(SELECT ClassId
FROM dbo.tbl2
WHERE PNumber= '132456789')
GROUP BY
PNumber)
將僅返回一個「ClassID」記錄。由於ClassID在兩個表中都是相同的,所以您不需要瀏覽所有內容,並且可以簡化爲。
AND ClassId IN (SELECT MAX(ClassId)
FROM dbo.tbl2
WHERE PNumber= '132456789')
由於您的PNumber是單數,沒有必要按它,它只會返回最大()類爲ID進不去。
所以問題......是你打算在得到只從單一的ClassID和運行?
現在,他這樣說,我就重寫一遍,所以這是第一個查詢...獲取您所關心的一類ID,然後讓這種類型的所有其他條目與其他標準。
SELECT
T.Id,
T.PNumber,
T.ClassId,
T.ClassType,
T.CreateDate,
T.EndDate
FROM
(SELECT MAX(T2.ClassId) MaxClass
FROM dbo.tbl2 T2
WHERE T2.PNumber= '132456789') OneClass
JOIN dbo.tbl T
on OneClass.MaxClass = T.ClassID
AND NOT T.ClassType IN ('A', 'B', 'C')
AND (T.EndDate IS NULL OR DATEDIFF(T.d, T.EndDate, GETDATE()) < 0 )
另外請注意,我應用了所有的alias.field引用來保持字段來自哪個表,尤其是當涉及到任何連接時。
你有合適的索引嗎? – asawyer
是的,我們已經檢查過。 – sharcfinz
1)告訴我們DBMS作爲性能調優因SQL產品而異。和2)發佈解釋/查詢計劃。沒有這些,我們真的不能說太多。 – RBarryYoung