2010-01-11 13 views
14

Ich weiß nicht einmal, ob ich diese Abfrage richtig mache. Es gibt eine Sandwiches Tabelle mit 7 Feldern und 2 davon sind Comboboxen (Type und Bread).Eine Select-Abfrage Auswählen einer Select-Anweisung

Also machte ich eine Abfrage, die alle der Comboboxen Werte in einer Abfrage, wie folgt kombiniert:

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; 

ich die flachen Werte der Tabellen bekommen ich alle Sandwiches unter jedem TypesAndBreads.TBName zählen möchten. Ich habe diese, nur um sicherzustellen, dass es funktioniert mit allen Sandwiches:

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

Aber ich möchte den aktuellen Typ und TBNAME innerhalb der Unterabfrage verweisen. Etwas wie das:

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

Aber natürlich funktioniert das nicht. Ich dachte nicht, dass es so wäre, nur daran gedacht, es zu versuchen. Ich dachte über das Konstruieren der Abfrage mit VBA, wenn sie den Bericht öffnen, auf dem diese Abfrage basieren wird.

Also ich denke, meine Frage ist: Gibt es eine Möglichkeit, die aktuell ausgewählten Felder in einer Unterabfrage zu verweisen? Oder geht es anders?

Danke für die Hilfe

EDIT: Meine Tabellenstruktur ist wie folgt:

Sandwiches ‚s Felder

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

wo Sandwich Type und Bread Lookup Felder für diese Tabellen sind:

Sandwiches Types ‚s Felder

| Sandwich Type | 

Breads‘ s Felder

| Bread | 

Die TypesAndBreads Abfrage kombiniert, um die Sandwiches Typen und Brot- Tabellen, aber der Grund dafür ist, so dass ich die Anzahl aller Sandwiches bekommen die diesen Typ oder Brot haben. Ein Ergebnis wie folgt aus:

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

der ersten Zeile des Beispielergebnis basicly sagt, es gebe 10 Sandwiches in Datensatz mit dem Sandwich-Typ-Feld gleich Türkei Club sind.

Ich hoffe, dass es besser erklärt.

+0

Ich finde das ein bisschen verwirrend. Können Sie Ihre Tabellenstruktur und die gewünschte Ausgabe posten? – RedFilter

+0

Ich habe die Tabellenstruktur und einige gewünschte Ausgabe hinzugefügt, hoffe das hilft. Danke für den Kommentar. –

Antwort

17

Nicht sicher, ob Access unterstützt, aber in den meisten Motoren (einschließlich SQL Server) dies eine korrelierte Unterabfrage bezeichnet wird und funktioniert gut:

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 

Dies wird durch Indizierung effizienter gestaltet werden können Type und Bread und Verteilung der Unterabfragen über die 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] 
+0

Jet/ACE hat korrelierte Unterabfragen immer unterstützt. Sie sind jedoch in Bezug auf die Indexnutzung oft nicht gut optimiert. –

4

Ich war überkompliziert mich. eine lange Pause und kommen zurück, die gewünschte Ausgabe durch diese einfache Abfrage erreicht werden könnte, nach der Einnahme:

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

Dank für die Beantwortung, half es meinen Gedankengang.

Verwandte Themen