0

私は2つのテーブルを持っています。各ウィジェットに関する情報 (色、サイズなど) を含むウィジェット。各ウィジェットには一意の ID、WidgetID があります。
もう 1 つのテーブルは Tests で、各ウィジェットで実行された複数のテストに関する情報が含まれています。したがって、このテーブルには、WidgetID ごとに複数の行があります。呼び出すことができる情報 (WidgetID、Date、Param1、Param2 など) が含まれています。テスト情報。
WidgetID ごとに、最新の 2 つのテストを日付別に検索するクエリを作成しました。SQL は次のようになります。

SELECT Widgets.WidgetID, Widgets.Color, Widgets.Size, T.Date, T.Param1, T.Param2,*
FROM Tests AS T INNER JOIN Widgets ON T.WidgetID=Widgets.WidgetID
WHERE (((COUNT(*) を選択) FROM テスト
WHERE WidgetID = T.WidgetID AND Date > T.Date)) < 2 );

これは非常にうまく機能します。ただし、ウィジェットが多すぎます。WidgetFilter というウィジェットをフィルタリングするクエリを作成しました。基本的には、私が選択したものに基づいて、必要なものを選択するだけです。上記のコードの「Widgets」を「WidgetFilter」に置き換えて、同じクエリを実行するというアイデアでした。ただし、これを行うと、永遠にかかります。実際、それはただフリーズします。私はそれを1時間半放置しましたが、そこに座っていたので、ctl deleteをaltする必要がありました. 私の唯一の考えは、テストのすべての行(およびそれは多くの行)に対して WidgetFilter クエリをクエリしていることです。また、元のクエリ内でフィルター基準を適用してみました。同じ結果が得られます。

これを行うより良い方法はありますか?それをすべて実行し、おそらくこのように見えない単一のクエリ、または私が考えていたのは、WidgetFilterクエリを1回実行して、そのデータをテーブルのようにアクセスするように見せる方法があるはずです(そのようなものはありません一時テーブル)。そうすれば、テストのすべてのアイテムに対して WidgetFilter を実行しません。

編集:
WidgetFilter は実際にはかなり複雑です。ユーザーに 2 つの列が表示されるこれらの GUI ピック テーブルを作成しました。左側に選択肢、右側に作成中のリスト、中央に追加ボタンと削除ボタンがあります。次に、WidgetFilter、yadda yadda yadda を実行するレポートを呼び出します。とにかく、ユーザーがアイテムを追加すると、そのアイテムがテーブルに追加されます。したがって、ウィジェット カテゴリの Color には、ColorList というテーブルがあります。ユーザーは、GUI を使用してこのリストを作成します。これらの gui には 3 つ (色、サイズ、タイプ) があります。それらのそれぞれにテーブルがあり、次に使用するフィルター (Color、Size、または Type) を示す Global boolean (ColorFlag など) があります。
したがって、WidgetFilter クエリでは、[色] の下の基準ボックスに次のように表示されます。
In(Select Color From ColorList)
には、グローバル変数 ColorFlag の値を返すモジュールである式列 Expr1: getColorFlag() があります。カラーテーブルが適用されると同時に真になります。したがって、すべてを言い終えると、3 行の基準があります。コードは次のようになります。


ウィジェットからWidgets.WidgetID、Widgets.Color、Widgets.Size、Widgets.Type を
選択し
ます。 Size) In(Select Size FROM SizeList))
OR (getTypeFlag() = True AND (Widgets.Type) In(Select Type FROM TypeList))

4

3 に答える 3

1

あなたが気づいていないかもしれない1つのこと。いずれかの行にNULL値を返す副選択がある場合、Accessのほとんどのバージョン(2007についてはわかりません)はループランドに移行すると思います。したがって、これらのテーブルのいずれかにNULLの色、サイズ、またはタイプがあり、表示されている症状を引き起こす場合。

于 2009-10-13T00:02:14.077 に答える
0

シンプルです。

SELECT TOP 2 Widgets.WidgetID, Widgets.Color, Widgets.Size, T.Date, T.Param1, T.Param2,*
FROM Tests AS T INNER JOIN Widgets ON T.WidgetID=Widgets.WidgetID
ORDER BY T.Date DESC
于 2012-06-01T07:20:49.287 に答える
0

Ok。これが私がやったことです。次のような VBA コードを使用して一時テーブルを作成しました。

Function createWidgetFilterTemp()
Dim mySQL
Dim deleteSQL
deleteSQL = "DELETE * FROM TempWidgetFilter"
mySQL = "SELECT * INTO TempWidgetFilter FROM WidgetFilter" DoCmd.SetWarnings False
DoCmd.RunSQL deleteSQL
DoCmd.RunSQL mySQL
DoCmd.SetWarnings True
End Function

WidgetCombo というクエリで、TempWidgetFilter と Tests を内部結合しました。これにより、すべての Test 情報と、関心のある WidgetID のすべての Widgets 情報にアクセスできるようになりました。 Select Count(*) ステートメントを使用して同じクエリを実行しようとしましたが、Access がフリーズするという同じ問題が発生しました。 . そこで、次のようなコードを使用して、VBA を介して別の一時テーブルを作成しました。

Function createWidgetTemp()
Dim mySQL
Dim deleteSQL
deleteSQL = "DELETE * FROM TempWidgetCombo"
mySQL = "SELECT * INTO TempWidgetCombo FROM WidgetCombo" DoCmd.SetWarnings False
DoCmd.RunSQL deleteSQL
DoCmd.RunSQL mySQL
DoCmd.SetWarnings True
End Function

フォームからクエリを呼び出すたびに、これらの関数の両方を実行しました。これはうまくいきました!! 実際、それはかなり迅速に機能しました。最初の一時テーブルがなくても機能したと思いますが、それを単なるクエリではなく一時テーブルとして使用すると、アプリの別の部分の実行が速くなったので、そのままにしました。ちなみに、テーブルを作成するために、削除行をコメントアウトして一度実行する必要がありました。手動でテーブルを作成できたかもしれないと思いますが、この方法ですべてのフィールドが正しい方法で取得されました。助けてくれてありがとう、これが将来一時テーブルのヘルプを探しに来る他の誰かに役立つことを願っています.

于 2009-10-13T16:00:43.237 に答える