Запрос выбора, выбирающий оператор выбора - PullRequest
16 голосов
/ 11 января 2010

Я даже не знаю, правильно ли я делаю этот запрос. Существует таблица Sandwiches, в которой есть около 7 полей, и 2 из них - комбинированные списки (Type и Bread).

Итак, я сделал запрос, который объединяет все значения комбинированных списков в один запрос, например:

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, когда они откроют отчет, на котором будет основан этот запрос.

Итак, я предполагаю, что мой вопрос: Есть ли способ ссылки на текущие выбранные поля в подзапросе? Или есть другой способ подойти к этому?

Спасибо за помощь

EDIT: Моя структура таблицы такая:

Sandwiches поля

| SandwichID | Name | Date Added | Chef | Sandwich Type | Bread | Reviewed By |

, где Sandwich Type и Bread - поля поиска для этих таблиц:

Sandwiches Types поля

| Sandwich Type |

Breads поля

| Bread |

Запрос TypesAndBreads объединил таблицы типов сэндвичей и хлебов, но причина в том, что я могу получить счетчик всех сэндвичей с этим типом или хлебом. Такой результат:

+=============================================+
|      Type     |    TBName   | SandwichCount |
+=============================================+
| Sandwich Type | Turkey Club |            10 |
| Bread         | Italian     |             5 |
| Bread         | Garlic      |             8 |
+---------------------------------------------+

В первой строке результата примера в основном говорится, что в записи записано 10 сэндвичей с полем «Тип сэндвича», равным Turkey Club.

Надеюсь, это объясняет лучше.

Ответы [ 2 ]

22 голосов
/ 11 января 2010

Не уверен, поддерживает ли это 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]
5 голосов
/ 11 января 2010

Я слишком усложнял себя. После долгого перерыва и возвращения желаемый результат может быть получен с помощью этого простого запроса:

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

Спасибо за ответ, это помогло моему ходу мыслей.

...