2010-01-11 79 views
14

我甚至不知道我是否以正确的方式执行此查询。 有一个Sandwiches表有7个字段,其中2个是组合框(TypeBread)。选择查询选择语句

所以我提出,结合了所有组合框的值到一个查询,这样的查询:

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; 

但我想引用里面的子查询当前Type和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构建查询,当他们打开此查询将基于的报告时。

所以我想我的问题是:有没有办法引用子查询中当前选定的字段?还是有不同的方法来解决这个问题?

感谢您的帮助

编辑: 我的表结构是这样的:

Sandwiches的领域

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

其中Sandwich TypeBread是这些表的查阅字段:

Sandwiches Types的领域

| Sandwich Type | 

Breads的领域

| Bread | 

的TypesAndBreads查询相结合的三明治类型和面包表,但之所以说是为了让我可以得到所有的三明治伯爵那种类型或面包。像这样的结果:

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

的例子结果的第一行basicly说,有10个三明治与三明治类型字段等于土耳其俱乐部纪录。

我希望能更好地解释它。

+0

我发现这有点混乱。你可以发布你的表格结构和所需的输出吗? – RedFilter 2010-01-11 18:24:45

+0

我添加了表结构和一些所需的输出,希望有所帮助。感谢您的评论。 – 2010-01-11 20:04:17

回答

17

不知道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 

这可以通过索引TypeBread和分配更有效率子查询结果为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一直支持相关的子查询。但是,它们在索引使用方面通常没有很好的优化。 – 2010-01-11 19:41:03

4

我过于复杂了。长时间休息和回来后,所需的输出可以通过这个简单的查询来实现:回答

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

谢谢,这帮助了我的思路。