Я даже не знаю, делаю ли я этот запрос правильный путь. Существует a 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;
Но я хочу сослаться на текущий Тип и 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, когда они открывают Report, из которого этот запрос будет основанным.
Таким образом, я предполагаю, что мой вопрос: существует ли способ сослаться на текущие выбранные поля в подзапросе? Или есть ли другой способ приблизиться к этому?
Спасибо за справку
Править: Моя структура таблицы похожа на это:
Sandwiches
поля
| SandwichID | Name | Date Added | Chef | Sandwich Type | Bread | Reviewed By |
где Sandwich Type
и Bread
поля Lookup для этих таблиц:
Sandwiches Types
поля
| Sandwich Type |
Breads
поля
| Bread |
Запрос TypesAndBreads объединил таблицы Sandwiches Types и Breads, но причина этого состоит в том так, чтобы я мог получить количество всех тестовых систем, которые имеют тот Тип или хлеб. Результат как это:
+=============================================+
| Type | TBName | SandwichCount |
+=============================================+
| Sandwich Type | Turkey Club | 10 |
| Bread | Italian | 5 |
| Bread | Garlic | 8 |
+---------------------------------------------+
первая строка результата примера basicly говорит, что существует 10 тестовых систем в записи с полем Sandwich Type, равным Клубу Турции.
Я надеюсь, что это объясняет это лучше.
Не уверены, если доступ поддерживает его, но в большинстве двигателей (в том числе 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
Это может быть сделано больше Эффективно по индексации Тип
и Хлеб
и распространение подзапросов на союзе
:
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;
Спасибо за ответ, это помогло моей череде размышлений.