1

我正在使用 C# 在 C# 中填充一个 DataTable OleDbDataAdapter,并且我试图让一个查询正常工作,但没有取得多大成功。

与服务器之间的通信工作正常,简单查询返回所有记录而无需任何过滤器就证明了这一点:

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 仅选择列上具有最大值的行

如何在 SQL 中通过另一列选择具有 MAX(列值)、DISTINCT 的行?

获取列的最大值所在的行

按另一列选择具有最大列值组的行

以上所有内容要么返回与我的原始查询相同的内容,要么只是由于语法错误而出错。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 命令被忽略...

4

2 回答 2

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}'
于 2013-07-30T14:57:58.670 回答
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);
于 2013-07-30T16:42:01.833 回答