このクエリを正しい方法で実行しているかどうかさえわかりません。いくつかの7つのフィールドを持つSandwiches
テーブルがあり、そのうちの2つはコンボボックス(Type
とBread
)です。
そこで、次のように、コンボボックスのすべての値を1つのクエリに結合するクエリを作成しました。
SELECT TypesAndBreads.TBName, TypesAndBreads.Type
FROM (SELECT [Sandwiches Types].[Sandwich Type] As TBName, "Sandwich Type" As Type
FROM [Sandwiches Types]
UNION ALL
SELECT Breads.Bread As TBName, "Bread" As Type
FROM Breads) AS TypesAndBreads;
テーブルの下のすべてのサンドイッチをカウントしたいので、テーブルのフラットな値を取得しますTypesAndBreads.TBName
。すべてのサンドイッチで機能することを確認するために、これがあります:
SELECT TypesAndBread.Type, TypesAndBread.TBName,
(SELECT Count(Sandwiches.[SandwichID]) As SandwichCount
FROM Sandwiches) As SandwichCount
FROM TypesAndBread;
しかし、サブクエリ内の現在のTypeとTBNameを参照したいと思います。このようなもの:
SELECT TypesAndBread.Type, TypesAndBread.TBName,
(SELECT Count(Sandwiches.[SandwichID]) As SandwichCount
FROM Sandwiches
WHERE Sandwiches.[TypesAndBread.Type] = Sandwiches.[TypesAndBread.TBName]) As SandwichCount
FROM TypesAndBread;
しかし、もちろんこれは機能しません。私はそれがそうなるとは思わなかった、ただ試してみようと思った。このクエリの基になるレポートを開くときに、VBAでクエリを作成することを考えていました。
だから私の質問は:サブクエリで現在選択されているフィールドを参照する方法はありますか?または、これにアプローチする別の方法がありますか?
助けてくれてありがとう
編集:私のテーブル構造は次のようなものです:
Sandwiches
のフィールド
| SandwichID | Name | Date Added | Chef | Sandwich Type | Bread | Reviewed By |
ここで、Sandwich Type
およびBread
は、これらのテーブルのルックアップフィールドです。
Sandwiches Types
のフィールド
| Sandwich Type |
Breads
のフィールド
| Bread |
TypesAndBreadsクエリはSandwiches TypesテーブルとBreadsテーブルを組み合わせましたが、その理由は、そのTypeまたはbreadを持つすべてのサンドイッチの数を取得できるようにするためです。このような結果:
+=============================================+
| Type | TBName | SandwichCount |
+=============================================+
| Sandwich Type | Turkey Club | 10 |
| Bread | Italian | 5 |
| Bread | Garlic | 8 |
+---------------------------------------------+
例の結果の最初の行は、基本的に、Sandwich TypeフィールドがTurkey Clubに等しい10個のサンドイッチが記録されていることを示しています。
それがそれをより良く説明することを願っています。
Accessがサポートしているかどうかはわかりませんが、ほとんどのエンジン(SQL Server
)これは相関サブクエリと呼ばれ、正常に機能します。
SELECT TypesAndBread.Type, TypesAndBread.TBName,
(
SELECT Count(Sandwiches.[SandwichID]) As SandwichCount
FROM Sandwiches
WHERE (Type = 'Sandwich Type' AND Sandwiches.Type = TypesAndBread.TBName)
OR (Type = 'Bread' AND Sandwiches.Bread = TypesAndBread.TBName)
) As SandwichCount
FROM TypesAndBread
Type
とBread
にインデックスを付け、UNION
にサブクエリを分散することで、これをより効率的にすることができます。
SELECT [Sandwiches Types].[Sandwich Type] As TBName, "Sandwich Type" As Type,
(
SELECT COUNT(*) As SandwichCount
FROM Sandwiches
WHERE Sandwiches.Type = [Sandwiches Types].[Sandwich Type]
)
FROM [Sandwiches Types]
UNION ALL
SELECT [Breads].[Bread] As TBName, "Bread" As Type,
(
SELECT COUNT(*) As SandwichCount
FROM Sandwiches
WHERE Sandwiches.Bread = [Breads].[Bread]
)
FROM [Breads]
私は自分自身を過度に複雑にしていました。長い休憩を取り、戻った後、次の簡単なクエリで目的の出力を達成できます。
SELECT Sandwiches.[Sandwich Type], Sandwich.Bread, Count(Sandwiches.[SandwichID]) AS [Total Sandwiches]
FROM Sandwiches
GROUP BY Sandwiches.[Sandwiches Type], Sandwiches.Bread;
答えてくれてありがとう、それは私の思考の流れを助けました。