2010-01-11 13 views
14

Ni siquiera sé si estoy haciendo esta consulta de la manera correcta. Hay una tabla Sandwiches que tiene unos 7 campos y 2 de ellos son cuadros combinados (Type y Bread).Una consulta de selección seleccionando una instrucción de selección

así que hice una consulta que combina todos los valores ComboBoxes en una sola consulta, así:

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; 

puedo obtener los valores planas de las tablas Ahora quiero contar todos los sándwiches bajo cada TypesAndBreads.TBName. Tengo esto, sólo para asegurarse de que funciona con todos los sándwiches:

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

Pero quiero hacer referencia al tipo actual y tbname dentro de la subconsulta. Algo como esto:

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

Pero, por supuesto, esto no funciona. No pensé que sería así, solo pensé en intentarlo. Estaba pensando en tal vez construir la consulta con VBA cuando abren el Informe en el que va a estar basada esta consulta.

Supongo que mi pregunta es: ¿Hay alguna manera de hacer referencia a los campos seleccionados actualmente en una subconsulta? ¿O hay una forma diferente de abordar esto?

Gracias por la ayuda

EDIT: Mi estructura de la tabla es la siguiente:

Sandwiches 's campos

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

donde Sandwich Type y Bread son campos de búsqueda para estas tablas:

'Campos s

| Sandwich Type | 

Breads' Sandwiches Types campos s

| Bread | 

La consulta TypesAndBreads combinan los tipos sándwiches y tablas Panes, pero la razón de esto es para que pueda obtener el recuento de todos los bocadillos que tiene ese tipo o pan Un resultado como este:

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

primera fila del resultado ejemplo básicamente dice que hay 10 sándwiches en registro con el campo Tipo Sandwich igual a Turquía Club.

Espero que eso lo explique mejor.

+0

Esto me parece un poco confuso. ¿Puedes publicar tu estructura de tabla y la salida deseada? – RedFilter

+0

Agregué la estructura de la tabla y algunos resultados deseados, espero que ayude. Gracias por el comentario. –

Respuesta

17

No estoy seguro si el acceso es compatible con él, pero en la mayoría de los motores (incluyendo SQL Server) esto se llama una consulta correlacionada y funciona 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 

Esto puede hacerse más eficiente mediante la indexación Type y Bread y distribuir el sub consultas sobre el 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 siempre ha admitido subconsultas correlacionadas. Sin embargo, a menudo no están bien optimizados en términos de uso del índice. –

4

yo estaba complicar demasiado a mí mismo. Después de tomar un largo descanso y volver, la salida deseada podría lograrse mediante esta consulta sencilla:

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

Gracias por responder, que ayudó a mi línea de pensamiento.

Cuestiones relacionadas