2010-01-11 34 views
14

Tôi thậm chí không biết tôi có đang thực hiện truy vấn này đúng cách hay không. Có một bảng Sandwiches có 7 trường và 2 trong số đó là combobox (TypeBread).Truy vấn chọn một câu chọn chọn

Vì vậy, tôi đã thực hiện một truy vấn mà kết hợp tất cả các giá trị comboboxes vào một truy vấn, như thế này:

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; 

tôi nhận được các giá trị căn hộ của các bảng bây giờ tôi muốn đếm tất cả các bánh mì dưới mỗi TypesAndBreads.TBName. Tôi có điều này, chỉ để đảm bảo nó hoạt động với tất cả các Sandwiches:

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

Nhưng tôi muốn tham chiếu Loại và TBName hiện tại bên trong truy vấn phụ. Một cái gì đó như thế này:

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

Nhưng tất nhiên điều này không hiệu quả. Tôi đã không nghĩ rằng nó sẽ, chỉ nghĩ đến việc cho nó một thử. Tôi đã nghĩ đến việc có thể xây dựng các truy vấn với VBA khi họ mở Báo cáo rằng truy vấn này sẽ được dựa trên.

Vì vậy, tôi đoán câu hỏi của tôi là: Có cách nào để tham chiếu các trường được chọn hiện tại trong truy vấn phụ không? Hay có cách nào khác để tiếp cận điều này?

Thanks for the help

EDIT: cấu trúc bảng của tôi là như thế này:

Sandwiches 's lĩnh vực

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

nơi Sandwich TypeBread là các trường Lookup cho các bảng:

'Lĩnh vực s

| Sandwich Type | 

Breads' Sandwiches Types lĩnh vực s

| Bread | 

Truy vấn TypesAndBreads kết hợp Sandwiches loại và bảng Bánh mì, nhưng lý do cho điều đó là để tôi có thể lấy số liệu của tất cả các bánh mì có Loại hoặc bánh mì đó. Kết quả như sau:

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

hàng đầu tiên của kết quả ví dụ cho biết có 10 bánh mì trong hồ sơ có trường Loại bánh sandwich bằng Turkey Club.

Tôi hy vọng điều đó sẽ giải thích tốt hơn.

+0

Tôi thấy điều này hơi khó hiểu. Bạn có thể đăng cấu trúc bảng và đầu ra mong muốn không? – RedFilter

+0

Tôi đã thêm cấu trúc bảng và một số đầu ra mong muốn, hy vọng sẽ giúp. Cảm ơn bạn đã bình luận. –

Trả lời

17

Không chắc chắn nếu truy cập hỗ trợ nó, nhưng trong hầu hết các động cơ (bao gồm SQL Server) này được gọi là một subquery tương quan và hoạt động tốt:

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 

Điều này có thể được thực hiện hiệu quả hơn bằng cách lập chỉ mục TypeBread và phân phối truy vấn phụ trên số 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

Máy bay phản lực/ACE luôn hỗ trợ các truy vấn con tương quan. Tuy nhiên, chúng thường không được tối ưu hóa tốt về mặt sử dụng chỉ mục. –

4

Tôi đã quá phức tạp. Sau khi nghỉ ngơi dài và quay trở lại, kết quả mong muốn có thể được thực hiện bằng truy vấn đơn giản này:

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

Cảm ơn bạn đã trả lời, nó đã giúp tôi rèn luyện ý nghĩ.

Các vấn đề liên quan