2013-07-30 60 views
1

我在C#中使用OleDbDataAdapter填充DataTable,並且我試圖讓查詢在沒有太多成功的情況下工作。SQL在特定範圍內以列中的最大值返回行

通信向/從服務器工作正常,如由返回的所有記錄,沒有任何過濾的簡單查詢證明:

var commandText = string.Format("SELECT IsoShtRevID, LineID, Filename, Revision " + 
           "FROM dbo.PDSIsometricSheets WHERE SchemaName='{0}'", projectNo); 

這給了我大約8000個條目的列表,但是有一些冗餘。

有多行具有相同的LineID,但每個行都有一個單獨的修訂值。我試圖讓只爲每個LineID的最高版本的行,從範圍爲0〜5

這裏有幾個到目前爲止,我已經試過的嘗試:

var commandText = string.Format("SELECT * FROM 
           (SELECT max(Revision) as LatestRev 
           FROM dbo.PDSIsometricSheets) 
           WHERE Revision < 5" , projectNo); 


var commandText = string.Format("SELECT T.IsoShtRevID, T.LineID, T.Filename, T.Revision 
           FROM dbo.PDSIsometricSheets T 
           WHERE Revision = 
             (SELECT MAX(T1.Revision) 
             FROM dbo.PDSIsometricSheets T1 
             WHERE T1.IsoShtRevID = T.IsoShtRevID 
             )", projectNo); 

var commandText = string.Format("SELECT IsoShtRevID, LineID, Filename, MAX(Revision) as LatestRevision 
           FROM dbo.PDSIsometricSheets WHERE SchemaName='{0}' 
           GROUP BY LineID, IsoShtRevID, Filename", projectNo); 

下面是到目前爲止我去過試圖讓這個問題的工作:

SQL Select only rows with Max Value on a Column

How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

Fetch the row which has the Max value for a column

Select Rows with Maximum Column Value group by Another Column

一切上述任一返回同樣的事情,我原來的查詢,或壞的語法錯誤,只是出來。 SQL是我最棒的東西,我試圖通過使用DataAdapter來了解我的功能是否有限。

UPDATE:

以下是最新的迭代,利用下面的一些建議:

var commandText = string.Format("SELECT IsoShtRevID, LineID, Filename, MAX(Revision) as MaxRevision " + 
           "FROM dbo.PDSIsometricSheets " + 
           "WHERE SchemaName='{0}' AND Revision <= 5 AND Revision >= 0" + 
           "GROUP BY IsoShtRevID, LineID, Filename", projectNo); 

這濾掉修改爲0和​​5之間的值,但仍然有LineID多行,每行具有不同的版本號。這就像最大的命令被忽略...

+1

選項3給了你什麼(與GRO​​UP BY)?這看起來是我會走的路。它給了你一個錯誤,還是數據不是你所期待的? – evilbhonda

+0

選項3向我返回了與之前相同的8000行。我覺得我需要比較LatestRevision和Revision,但我不知道該把它放在哪裏。 –

+1

如果選項3沒有返回您期望的結果,那是因爲IsoShtRevID或FileName在各個修訂版本之間並不相同。 – Icarus

回答

1

終於得到它歸功於評論,閱讀更多的SQL和觀看我在運行時努力CommandString中的錯別字。

var commandText = string.Format("SELECT T1.IsoShtRevID, T1.LineID, T1.FileName, T1.Revision " + 
           "FROM dbo.PDSIsometricSheets T1 " + 
           "INNER JOIN (" + 
            "SELECT LineID, MAX(Revision) as MaxRevision " + 
            "FROM dbo.PDSIsometricSheets " + 
            "WHERE SchemaName='{0}' AND Revision <= 5 AND Revision >= 0" + 
            "GROUP BY LineID" + 
           ") T2 " + 
           "ON T1.LineID = T2.LineID AND T1.Revision = T2.MaxRevision ", projectNo); 
3

選項3應該工作,但如果它不是因爲FileName或IsoShtRevID跨修訂版本更改。在這種情況下,你可以這樣做:

SELECT a.IsoShtRevID , 
     a.LineID , 
     a.Filename , 
     a.Revision 
FROM dbo.PDSIsometricSheets a 
join (select max(Revision) as Revision, LineID 
     from dbo.PDSIsometricSheets where SchemaName ='{0}') x 
    join a on a.Revision = x.Revision and a.LineID=x.LineID 
WHERE a.SchemaName = '{0}' 
+0

這是我在示例2中試圖做的一種,但是我得到一個錯誤,告訴我'a'語法不正確。這就像它不會接受在運行時出於某種原因將當前表設置爲變量a。 –

相關問題