2017-01-19 4 views
1

私の質問とその背後にあるデータについては、Microsoft Access SQLは、グループ化されたレコードのセットの最後のレコードが別の列のものと等しいレコードのみを返します。

Microsoft Accessには、次のような構造のテーブルがあります。

ID1、ID2、データ1、データ2

ID1 - 項目(1,2,3,4など)

ID2を識別する番号フィールドですが - その識別番号フィールドですその項目への変更(1,2,3,4など...) これらはどちらも主キーに設定されています。両方のIDはレコードが一意であるために必要です。

データ1 - 同じこと、単にデータフィールド -

Data2の(変更を行ったユーザーの名前)の変更に関する情報を含むデータフィールド。

このデータのSQLクエリを実行して、ID1 = 1とし、ID2 =そのセットの最新レコードのData1の特定のアイテムのすべてのレコードを返す必要があります。

ID2は、最後の行の内容が異なる場合があります。したがって、ID1が1の場合、そのID1に対して7つのID2が存在する可能性があります。そのため、確認する必要があるのは7です。 ID1が2の場合、3つの項目があるので、ID1 = 1の行7とID1 = 2の行3の両方をチェックして、その行のData1が特定の名前に等しいかどうかを調べるSQLが必要です。

私が研究したことから、ID1をまとめてグループ化する必要があるようですが、私が探しているものが見つかりませんでしたID1の各グループのID2。

これまでのところ私はここにいます。

SELECT ID1, Max(ID2), Data1, Data2 
FROM tbl_History 
WHERE Data1 = 'name' 
GROUP BY ID1 
ORDER BY ID2 DESC 

例データ:

ID1 | ID2 | Data1 | Data2 
-------------------------------- 
1  1  Name1  32 
1  2  Name2  23 
1  3  Name3  63 
1  4  Name2  53 
2  1  Name4  12 
2  2  Name5  16 
2  3  Name2  71 

期待される結果は、私がデータ1からname2の見れば、私は行1-4と2-3の両方を取得することです。この例でName5または2以外の他の名前を検索すると、最大ID2がなくData1列の名前があるため行がありません。

エラーが返されるのは、Data2が集計関数の一部ではないということです。私は技術的に既にData1を持っていますので、返されるデータから取り除くことができますが、私の上記の要件に基づいてData2をどのように取得できますか?多分グルーピングは私が行く必要がある方法ではありません。

私は、VB.NETを使用して、OleDb接続を介してMicrosoft Accessデータベースにアクセスしています。

ご協力いただければ幸いです。詳細が必要な場合はお知らせください。投稿していただければ幸いです。

+0

ルールによって一般GROUPは言う:GROUP BY句が指定されている場合、SELECTリスト内の各列の基準は、グループ化カラムを同定またはなければならないのいずれかでセット関数の引数! – jarlh

+0

大丈夫ですが、Data2から日付、テキスト、数字などのデータを取得するにはどのような関数を使用しますか。これがグループ化が行く方法ではないように感じる理由です。 –

+0

サンプルテーブルのデータと予想される結果を追加します。 (フォーマットされたテキストと同様に) – jarlh

答えて

1

where句に相関サブクエリを使用する:

select h.* 
from tbl_history as h 
where h.id2 = (select max(h2.id2) 
       from tbl_history as h2 
       where h.id1 = h2.id1 
      ); 
+0

これはまさに私が探しているようだが、私は次のエラーを受けているように感じる。 Microsoft Accessデータベースエンジンは、有効なフィールド名または式として 'h。*'を認識しません。私はおそらく、私はOleDb接続を介してMicrosoft AccessデータベースにアクセスするためにVB.NETを使用していることを言及する必要があります。もし私が別の選択肢を持っていれば私はそれを使うだろうが、これは私たちの会社が私たちに与えるものである。この情報で元の質問を更新します。 –

+0

私の一部にはタイプミス。私はtbl_history行の最後に "as h"を忘れてしまった。これは必要に応じて正確に動作するように見えます。迅速な対応に感謝し、私に与えられたものを正確に入力することができないことをお詫びします! :) –

関連する問題