Выбирающий запрос, выбирая оператор select
Я даже не знаю, правильно ли я делаю этот запрос.
Существует таблица Sandwiches
, в которой есть 7 полей, а 2 из них являются списками (Type
и Bread
).
Итак, я сделал запрос, который объединяет все значения comboboxes в один запрос, например:
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;
Но я хочу ссылаться на текущий тип и 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 объединены таблицы Sandwiches Types and Breads, но причина этого в том, что я могу получить счет всех бутербродов, имеющих этот тип или хлеб. Результат такой:
+=============================================+
| Type | TBName | SandwichCount |
+=============================================+
| Sandwich Type | Turkey Club | 10 |
| Bread | Italian | 5 |
| Bread | Garlic | 8 |
+---------------------------------------------+
В результате первой строки примера говорится, что в записи записано 10 бутербродов с полем типа "Сэндвич", равным турецкому клубу.
Я надеюсь, что это объяснит это лучше.
Ответы
Ответ 1
Не уверен, поддерживает ли 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]
Ответ 2
Я слишком усложнял себя. После долгого перерыва и возврата назад желаемый результат может быть выполнен с помощью этого простого запроса:
SELECT Sandwiches.[Sandwich Type], Sandwich.Bread, Count(Sandwiches.[SandwichID]) AS [Total Sandwiches]
FROM Sandwiches
GROUP BY Sandwiches.[Sandwiches Type], Sandwiches.Bread;
Спасибо, что ответили, это помогло моему мышлению.