1

を使用して C# で DataTable にデータを入力してOleDbDataAdapterいますが、クエリを機能させようとしていますが、あまり成功していません。

フィルターなしですべてのレコードを返す単純なクエリによって証明されるように、サーバーとの間の通信は正常に機能します。

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

これにより、約 8000 エントリのリストが得られますが、多少の冗長性があります。

同じ LineID を持つ複数の行がありますが、それぞれに個別の Revision 値があります。0 から 5 の範囲で、各 LineID のリビジョンが最も高い行のみを取得しようとしています。

これまでに試したいくつかの試みを次に示します。

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 は、列に最大値を持つ行のみを選択します

MAX(列値)で行を選択し、SQLの別の列で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