web-dev-qa-db-fra.com

Une requête de sélection sélectionnant une instruction de sélection

Je ne sais même pas si je fais cette requête correctement. Il y a une table Sandwiches qui a 7 champs et 2 d'entre eux sont des comboboxes (Type et Bread).

J'ai donc fait une requête qui combine toutes les valeurs des zones de liste déroulante en une seule requête, comme ceci:

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;

Je reçois les valeurs plates des tableaux maintenant je veux compter tous les sandwichs sous chaque TypesAndBreads.TBName. J'ai ceci, juste pour m'assurer qu'il fonctionne avec tous les sandwichs:

SELECT TypesAndBread.Type, TypesAndBread.TBName,
       (SELECT Count(Sandwiches.[SandwichID]) As SandwichCount
        FROM Sandwiches) As SandwichCount
FROM TypesAndBread;

Mais je veux faire référence au type et au TBName actuels dans la sous-requête. Quelque chose comme ça:

SELECT TypesAndBread.Type, TypesAndBread.TBName,
       (SELECT Count(Sandwiches.[SandwichID]) As SandwichCount
        FROM Sandwiches
        WHERE Sandwiches.[TypesAndBread.Type] = Sandwiches.[TypesAndBread.TBName]) As SandwichCount
FROM TypesAndBread;

Mais bien sûr, cela ne fonctionne pas. Je ne pensais pas que ce serait le cas, je pensais juste à l'essayer. Je pensais peut-être construire la requête avec VBA quand ils ouvriront le rapport sur lequel cette requête va être basée.

Donc je suppose que ma question est: Existe-t-il un moyen de référencer les champs actuellement sélectionnés dans une sous-requête? Ou existe-t-il une manière différente d'aborder cela?

Merci pour l'aide

EDIT: Ma structure de table est comme ceci:

Champs de Sandwiches

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

Sandwich Type et Bread sont des champs de recherche pour ces tables:

Champs de Sandwiches Types

| Sandwich Type |

Champs de Breads

| Bread |

La requête TypesAndBreads a combiné les tables Sandwiches Types et Breads, mais la raison en est que je peux obtenir le nombre de tous les sandwichs qui ont ce type ou ce pain. Un résultat comme celui-ci:

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

la première ligne du résultat d'exemple indique fondamentalement qu'il y a 10 sandwichs enregistrés avec le champ Type de sandwich égal à Turkey Club.

J'espère que cela explique mieux.

16
Tony L.

Je ne sais pas si Access le prend en charge, mais dans la plupart des moteurs (y compris SQL Server) cela s'appelle une sous-requête corrélée et fonctionne très bien:

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

Cela peut être rendu plus efficace en indexant Type et Bread et en répartissant les sous-requêtes sur 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

Je me compliquais trop. Après une longue pause et un retour, la sortie souhaitée pourrait être accomplie par cette simple requête:

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

Merci d'avoir répondu, cela a aidé ma réflexion.

5
Tony L.