前提
非常に古い Access 2000 データベースを変更する必要があります。私が持っているのは2つのテーブルです:
製品表:
- テキストとしての pID - これはキー フィールドです (はい、テキストです。それについては何もできません)
- 整数としての pLevel - これは製品レベルです: 0=完成、1 から 7=サブ製品
- pDescription as text - 単なる説明
P アソシエーションテーブル:
- テキストとしての pIDParent
- テキストとしての pIDChild
このテーブルが行うことは、(サブ) 製品と他のサブ製品との間の関連付けです。「ルール」は、pIDChild レベルが pIDParent レベルより高くなければならないということです。
次に、特定の pID のすべての子を表示する Form があります。これは、クエリの「チェーン」に基づいています。
これはクエリ q-pAssociation0 で、選択した製品を調べて子を返します。
SELECT DISTINCTROW [t-Associations].pIDParent, [t-Associations].pIDChild, [t-Products].pLevel AS pParentLevel, [t-Products].pLevel AS pChildLevel FROM [t-Products] INNER JOIN [t-Associations] ON [t-Products].pID = [t-Associations].pIDChild
WHERE ((([t-Associations].pIDParent)=[Forms]![fTreeProdotti]![txtProdID]));
次に、7 つのクエリ(q-pAssociation1~q-pAssociation7)があり、それぞれが前のクエリに取り組んでいます。q-pAssociation1 は次のとおりです。
SELECT DISTINCTROW [q-pAssociation0].pIDChild AS pIDParent, [t-Associations].pIDChild, [q-pAssociation0].pChildLevel AS pParentLevel, [t-Products].pLevel AS pChildLevel FROM [q-pAssociation0] INNER JOIN ([t-Products] INNER JOIN [t-Associations] ON [t-Products].pID = [t-Associations].pIDChild) ON [q-pAssociation0].pIDChild = [t-Associations].pIDParent;
最後に、以前のすべてのクエリをグループ化し、フォームのベースとなる GROUP クエリがあります。
質問 クエリがレベル = 親レベル + 1 の子のみを返すように、これをすべて変更する必要があります (したがって、親が子 2 レベル「ダウン」以上を持っている場合、それを返す必要はありません。
したがって、各クエリに条件を追加しました。
SELECT DISTINCTROW [q-pAssociation0].pIDChild AS pIDParent, [t-Associations].pIDChild, [q-pAssociation0].pChildLevel AS pParentLevel, [t-Products].pLevel AS pChildLevel
FROM [q-pAssociation0] INNER JOIN ([t-Products] INNER JOIN [t-Associations] ON [t-Products].pID = [t-Associations].pIDChild) ON [q-pAssociation0].pIDChild = [t-Associations].pIDParent
WHERE ((([t-Products].pLevel)=[q-pAssociation0]![pParentLevel]+1));
しかし、現在、q-pAssociation7 は約 15 レコードを返すのに 10 分を必要としますが、「WHERE」条件がなければ、約 25 レコードをほぼ即座に返します。
この遅いクエリを使用せずに、1 レベル下の製品のみを取得するにはどうすればよいですか?