web-dev-qa-db-ja.com

選択ステートメントを選択する選択クエリ

このクエリを正しい方法で実行しているかどうかさえわかりません。いくつかの7つのフィールドを持つSandwichesテーブルがあり、そのうちの2つはコンボボックス(TypeBread)です。

そこで、次のように、コンボボックスのすべての値を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個のサンドイッチが記録されていることを示しています。

それがそれをより良く説明することを願っています。

16
Tony L.

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

TypeBreadにインデックスを付け、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]
22
Quassnoi

私は自分自身を過度に複雑にしていました。長い休憩を取り、戻った後、次の簡単なクエリで目的の出力を達成できます。

SELECT Sandwiches.[Sandwich Type], Sandwich.Bread, Count(Sandwiches.[SandwichID]) AS [Total Sandwiches]
FROM Sandwiches
GROUP BY Sandwiches.[Sandwiches Type], Sandwiches.Bread;

答えてくれてありがとう、それは私の思考の流れを助けました。

5
Tony L.