我正在使用OleDbDataAdapter
在C#中填充DataTable,我试图让查询无法取得成功。
与服务器之间的通信工作正常,正如简单查询所证明的那样,它返回所有记录而没有任何过滤器:
var commandText = string.Format("SELECT IsoShtRevID, LineID, Filename, Revision " +
"FROM dbo.PDSIsometricSheets WHERE SchemaName='{0}'", projectNo);
这给了我一个大约8000个条目的列表,但是有一些冗余。
有多个行具有相同的LineID,但每个行都有一个单独的Revision值。我试图只获取每个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来确定我的功能是否有限。
更新:
这是最新的迭代,使用下面的一些建议:
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仍有多行,每行都有不同的版本号。这就像Max命令被忽略了......
答案 0 :(得分: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}'
答案 1 :(得分:1)
最后得到了感谢评论,阅读更多SQL,并在运行时努力查看我的命令字符串以进行拼写错误。
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);