Dùng một truy vấn hợp để kết hợp nhiều truy vấn vào một kết quả đơn
Applies ToAccess cho Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

Đôi khi, bạn có thể muốn liệt kê các bản ghi trong một bảng hoặc truy vấn với những bản ghi trong một hoặc nhiều bảng khác để hình thành một bộ nhiều bản ghi - danh sách gồm tất cả các bản ghi từ hai hoặc nhiều bảng. Đây là mục đích của một truy vấn hợp trong Access.

Để hiểu truy vấn hợp một cách hiệu quả, trước tiên bạn sẽ làm quen với việc thiết kế truy vấn chọn cơ bản trong Access. Để tìm hiểu thêm thông tin về thiết kế truy vấn chọn, hãy xem mục Tạo truy vấn chọn đơn giản.

Nghiên cứu ví dụ truy vấn hợp hoạt động

Nếu bạn chưa bao giờ tạo một truy vấn hợp trước đó, bạn có thể thấy hữu ích khi nghiên cứu một ví dụ hoạt động trong mẫu Northwind Access trước tiên. Bạn có thể tìm kiếm mẫu mẫu Northwind trên trang bắt đầu của Access bằng cách bấm vào Tệp > Mới hoặc có thể trực tiếp tải xuống bản sao từ vị trí này: Mẫu mẫu Northwind.

Sau khi Access mở cơ sở dữ liệu Northwind, hãy bỏ qua biểu mẫu hộp thoại đăng nhập xuất hiện đầu tiêu, rồi bung rộng Ngăn dẫn hướng. Bấm vào phần trên cùng của Ngăn dẫn hướng, rồi chọn Loại đối tượng để sắp xếp tất cả các đối tượng cơ sở dữ liệu theo loại. Tiếp theo, bung rộng nhóm Truy vấn và bạn sẽ thấy một truy vấn có tên là Giao dịch sản phẩm.

Truy vấn hợp rất dễ phân biệt với các đối tượng truy vấn khác vì có biểu tượng đặc biệt giống như hai vòng tròn cuộn vào nhau đại diện cho một bộ liên kết từ hai bộ:

Ảnh chụp màn hình biểu tượng truy vấn hợp trong Access.

Không giống như truy vấn chọn và hành động thông thường, các bảng không liên quan nhau trong truy vấn hợp, có nghĩa là không thể sử dụng trình thiết kế truy vấn đồ họa Access để xây dựng hoặc chỉnh sửa truy vấn hợp. Bạn sẽ gặp vấn đề này nếu mở một truy vấn hợp từ Ngăn dẫn hướng; Access sẽ mở truy vấn và hiển thị kết quả ở dạng xem biểu dữ liệu. Bên dưới lệnh Dạng xem trên tab Trang đầu, bạn sẽ nhận thấy rằng Dạng xem thiết kế sẽ không sẵn dùng khi làm việc với truy vấn hợp. Bạn chỉ có thể chuyển đổi giữa Dạng xem biểu dữ liệuDạng xem SQL khi làm việc với truy vấn hợp.

Để tiếp tục nghiên cứu về ví dụ truy vấn hợp này, hãy bấm vào Trang đầu > Dạng xem > Dạng xem SQL để xem cú pháp SQL xác định truy vấn. Trong hình minh họa này, chúng ta đã thêm một số giãn cách thừa trong SQL để bạn có thể dễ dàng thấy nhiều phần khác nhau tạo nên một truy vấn hợp.

Trình duyệt của bạn không hỗ trợ video. Hãy cài đặt Microsoft Silverlight, Adobe Flash Player hoặc Internet Explorer 9.

Hãy cùng nghiên cứu chi tiết cú pháp SQL của truy vấn hợp này từ cơ sở dữ liệu Northwind:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Phần đầu tiên và phần thứ ba của câu lệnh SQL này cơ bản là hai truy vấn chọn. Các truy vấn này truy xuất hai bộ bản ghi khác nhau; một từ bảng Đơn hàng sản phẩm và một từ bảng Mua sản phẩm.

Phần thứ hai trong câu lệnh SQL này là từ khóa UNION báo cho Access rằng truy vấn này sẽ kết hợp hai bộ bản ghi.

Phần cuối cùng của câu lệnh SQL này xác định thứ tự của các bản ghi được kết hợp bằng cách sử dụng câu lệnh ORDER BY. Trong ví dụ này, Access sẽ xếp thứ tự tất cả bản ghi theo trường Ngày đặt hàng theo thứ tự giảm dần.

Lưu ý: Truy vấn hợp luôn ở trạng thái chỉ đọc trong Access; bạn không thể thay đổi bất kỳ giá trị nào ở dạng xem biểu dữ liệu.

Tạo một truy vấn hợp bằng cách tạo và kết hợp các truy vấn chọn

Ngay cả khi có thể tạo truy vấn hợp bằng cách viết trực tiếp cú pháp SQL ở dạng xem SQL, bạn cũng có thể thấy dễ dàng hơn khi xây dựng truy vấn một số phần với truy vấn chọn. Sau đó, bạn có thể sao chép và dán các phần SQL vào một truy vấn hợp đã kết hợp.

Nếu bạn muốn bỏ qua đọc các bước và thay vào đó là xem ví dụ, hãy xem mục tiếp theo, Xem ví dụ về cách dựng truy vấn hợp.

  1. Trên tab Tạo, trong nhóm Truy vấn, bấm Thiết kế Truy vấn.

  2. Bấm đúp vào bảng có các trường bạn muốn đưa vào. Thêm bảng vào cửa sổ thiết kế truy vấn.

  3. Trong cửa sổ thiết kế truy vấn, hãy bấm đúp vào mỗi trường mà bạn muốn bao gồm. Khi bạn chọn trường, hãy đảm bảo rằng bạn thêm cùng số trường, trong cùng một thứ tự mà bạn thêm vào truy vấn chọn khác. Hết sức chú ý đến kiểu dữ liệu của trường và đảm bảo rằng chúng có kiểu dữ liệu tương thích với trường trong cùng một vị trí, trong truy vấn khác mà bạn đang kết hợp. Ví dụ: Nếu truy vấn chọn đầu tiên của bạn có năm trường, trường đầu tiên chứa dữ liệu ngày/thời gian, hãy đảm bảo rằng mỗi truy vấn chọn khác mà bạn đang kết hợp cũng có năm trường, trường đầu tiên chứa dữ liệu ngày/thời gian v.v.

  4. Bạn có thể tùy ý thêm tiêu chí vào các trường của mình bằng cách nhập biểu thức phù hợp vào hàng Tiêu chí của lưới trường.

  5. Sau khi đã hoàn tất việc thêm trường và tiêu chí trường, bạn nên chạy truy vấn chọn và xem lại đầu ra của truy vấn đó. Trên tab Thiết kế, trong nhóm Kết quả, bấm vào Chạy.

  6. Chuyển truy vấn sang dạng xem Thiết kế.

  7. Lưu truy vấn chọn và để truy vấn mở.

  8. Lặp lại thủ tục này cho mỗi truy vấn chọn mà bạn muốn kết hợp.

Giờ đây, bạn đã tạo các truy vấn chọn của mình, đã đến lúc kết hợp các truy vấn ấy. Trong bước này, bạn tạo truy vấn hợp bằng cách sao chép và dán các câu lệnh SQL.

  1. Trên tab Tạo, trong nhóm Truy vấn, bấm Thiết kế Truy vấn.

  2. Trên tab Thiết kế, trong nhóm Truy vấn, bấm vào Kết hợp. Access ẩn cửa sổ thiết kế truy vấn và hiển thị tab đối tượng dạng xem SQL. Lúc này, tab đối tượng dạng xem SQL là trống.

  3. Hãy bấm vào tab cho truy vấn chọn đầu tiên mà bạn muốn kết hợp trong truy vấn hợp.

  4. Trên tab Trang đầu, bấm vào Dạng xem > Dạng xem SQL.

  5. Sao chép câu lệnh SQL cho truy vấn chọn. Bấm vào tab dành cho truy vấn hợp bạn đã bắt đầu tạo trước đó.

  6. Dán câu lệnh SQL cho truy vấn chọn vào tab đối tượng của dạng xem SQL của truy vấn hợp.

  7. Xóa bỏ dấu chấm phẩy (;) ở cuối câu lệnh SQL của truy vấn chọn.

  8. Nhấn phím Enter để di chuyển con trỏ xuống một dòng, rồi nhập UNION vào dòng mới.

  9. Hãy bấm vào tab cho truy vấn chọn tiếp theo mà bạn muốn kết hợp trong truy vấn hợp.

  10. Lặp lại từ bước 5 tới bước 10 cho tới khi bạn đã sao chép và dán tất cả câu lệnh SQL cho truy vấn chọn vào trong cửa sổ dạng xem SQL của truy vấn hợp. Không xóa bỏ dấu chấm phẩy hoặc nhập bất cứ ký tự gì sau câu lệnh SQL cho truy vấn chọn cuối cùng.

  11. Trên tab Thiết kế, trong nhóm Kết quả, bấm Chạy.

Kết quả của truy vấn hợp sẽ xuất hiện ở Dạng xem biểu dữ liệu.

Xem ví dụ về cách dựng truy vấn hợp

Đây là ví dụ bạn có thể tạo lại trong cơ sở dữ liệu mẫu Northwind. Truy vấn hợp này thu thập tên người từ bảng Khách hàng và kết hợp với tên người từ bảng Nhà cung cấp. Nếu bạn muốn làm theo, hãy thực hiện các bước này trong bản sao cơ sở dữ liệu mẫu Northwind của mình.

Trình duyệt của bạn không hỗ trợ video. Hãy cài đặt Microsoft Silverlight, Adobe Flash Player hoặc Internet Explorer 9.

Đây là những bước cần thiết để xây dựng ví dụ này:

  1. Tạo hai truy vấn chọn có tên là Truy vấn_1 và Truy vấn_2 với các bảng Khách hàng và Nhà cung cấp tương ứng theo thứ tự làm nguồn dữ liệu. Sử dụng trường Tên và Họ làm giá trị hiển thị.

  2. Tạo một truy vấn mới có tên là Truy vấn_3 không có nguồn dữ liệu ban đầu, rồi bấm vào lệnh Kết hợp trên tab Thiết kế để đưa truy vấn này vào Truy vấn hợp.

  3. Sao chép và dán các câu lệnh SQL từ Truy vấn_1 và Truy vấn_2 vào Truy vấn_3. Đảm bảo loại bỏ dấu chấm phẩy thừa và thêm vào từ khóa UNION. Sau đó, bạn có thể kiểm tra kết quả của mình ở dạng xem biểu dữ liệu.

  4. Thêm vào mệnh đề xếp thứ tự vào một trong các truy vấn, rồi dán câu lệnh ORDER BY vào dạng xem SQL truy vấn hợp. Lưu ý rằng trong Truy vấn_3, truy vấn hợp, khi xếp thứ tự được gắn thêm, trước tiên, các dấu chấm phẩy, sau đó là tên bảng sẽ bị loại bỏ khỏi tên trường.

  5. SQL cuối cùng sẽ kết hợp và sắp xếp các tên dùng cho ví dụ truy vấn hợp này là như sau:

    SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
    FROM Customers
    
    UNION
    
    SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
    FROM Suppliers
    
    ORDER BY [Last Name], [First Name];

Nếu bạn viết cú pháp SQL một cách rất dễ dàng, bạn có thể chắc chắn viết trực tiếp câu lệnh SQL của riêng mình cho truy vấn hợp vào dạng xem SQL. Tuy nhiên, bạn có thể thấy hữu ích khi làm theo phương pháp tiếp cận về sao chép và dán SQL từ các đối tượng truy vấn khác. Từng truy vấn có thể phức tạp hơn nhiều so với các ví dụ truy vấn chọn đơn giản được sử dụng tại đây. Đây có thể là lợi thế của bạn khi tạo và kiểm tra từng truy vấn một cách cẩn thận trước khi kết hợp các truy vấn trong truy vấn hợp. Nếu truy vấn hợp không chạy, bạn có thể điều chỉnh từng truy vấn riêng lẻ cho đến khi thành công, rồi xây dựng lại truy vấn hợp của mình bằng cú pháp đúng.

Xem lại các mục còn lại của bài viết này để tìm hiểu thêm các mẹo và bí kíp về cách sử dụng truy vấn hợp.

Trong ví dụ ở mục trước đó sử dụng cơ sở dữ liệu Northwind, chỉ kết hợp được dữ liệu từ hai bảng. Tuy nhiên, bạn có thể kết hợp ba hoặc nhiều bảng rất dễ dàng trong một truy vấn hợp. Ví dụ: dựng trên ví dụ trước, bạn có thể cũng muốn kèm theo tên của nhân viên trong đầu ra truy vấn. Bạn có thể thực hiện tác vụ đó bằng cách thêm một truy vấn thứ ba và kết hợp với câu lệnh SQL trước đó với từ khóa UNION bổ sung như thế này:

SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Khi bạn xem kết quả ở dạng xem biểu dữ liệu, tất cả nhân viên sẽ được liệt kê cùng tên công ty mẫu, vốn có thể không phải rất hữu ích. Nếu bạn muốn trường đó cho biết một người là nhân viên nội bộ, từ nhà cung cấp hoặc từ khách hàng, bạn có thể đưa vào giá trị cố định thay cho tên công ty. Đây là giao diện của SQL:

SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Đây là giao diện kết quả sẽ xuất hiện ở dạng xem biểu dữ liệu. Access sẽ hiển thị năm bản ghi ví dụ này:

Công việc

Họ

Tên

Nội bộ

Freehafer

Nancy

Nội bộ

Giussani

Laura

Nhà cung cấp

Glasson

Stuart

Khách hàng

Goldschmidt

Daniel

Khách hàng

Gratacos Solsona

Antonio

Truy vấn bên trên có thể giảm được thậm chí nhiều hơn vì Access chỉ đọc tên của trường đầu ra từ truy vấn đầu tiên trong truy vấn hợp. Tại đây, bạn thấy chúng ta đã loại bỏ đầu ra khỏi các mục truy vấn thứ hai và thứ ba:

SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers

UNION

SELECT "In-house", [Last Name], [First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Trong truy vấn hợp Access, chỉ cho phép xếp thứ tự một lần nhưng từng truy vấn có thể được lọc riêng biệt. Việc dựng trên truy vấn hợp của mục trước, dưới đây là ví dụ về vị trí chúng ta đã lọc từng truy vấn bằng cách thêm mệnh đề WHERE.

SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"

UNION

SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"

ORDER BY [Last Name], [First Name];

Chuyển đổi sang dạng xem biểu dữ liệu và bạn sẽ thấy kết quả có dạng như sau:

Công việc

Họ

Tên

Nhà cung cấp

Andersen

Elizabeth A.

Nội bộ

Freehafer

Nancy

Khách hàng

Hasselberg

Jonas

Nội bộ

Hellung-Larsen

Anne

Nhà cung cấp

Hernandez-Echevarria

Amaya

Khách hàng

Mortensen

Sven

Nhà cung cấp

Sandberg

Mikael

Nhà cung cấp

Sousa

Luis

Nội bộ

Thorpe

Steven

Nhà cung cấp

Weiler

Cornelia

Nội bộ

Zare

Robert

Nếu các truy vấn cần kết hợp đều rất khác nhau, bạn có thể gặp phải một tình huống là trường đầu ra phải kết hợp dữ liệu của các loại dữ liệu khác nhau. Nếu vậy, truy vấn hợp hầu như thường sẽ trả về kết quả dưới dạng loại dữ liệu văn bản do loại dữ liệu có thể lưu giữ cả văn bản số.

Để tìm hiểu cách truy vấn này hoạt động, chúng ta sẽ sử dụng truy vấn hợp Giao dịch sản phẩm trong cơ sở dữ liệu mẫu Northwind. Mở cơ sở dữ liệu mẫu đó, rồi mở truy vấn Giao dịch sản phẩm ở dạng xem biểu dữ liệu. Mười bản ghi cuối cùng phải tương tự như đầu ra này:

ID Sản phẩm

Ngày đặt hàng

Tên công ty

Giao dịch

Số lượng

77

22/01/2006

Nhà cung cấp B

Mua

60

80

22/01/2006

Nhà cung cấp D

Mua

75

81

22/01/2006

Nhà cung cấp A

Mua

125

81

22/01/2006

Nhà cung cấp A

Mua

200

7

20/01/2006

Công ty D

Bán

10

51

20/01/2006

Công ty D

Bán

10

80

20/01/2006

Công ty D

Bán

10

34

15/01/2006

Công ty AA

Bán

100

80

15/01/2006

Công ty AA

Bán

30

Hãy giả định rằng bạn muốn trường Số lượng chia tách vào hai - Mua và Bán. Cũng hãy giả định rằng bạn muốn có giá trị số không cố định cho trường không có giá trị. Đây là giao diện của SQL đối với truy vấn hợp này:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC; 

Nếu bạn chuyển đổi sang dạng xem biểu dữ liệu, bạn sẽ thấy mười bản ghi cuối cùng giờ đây được hiển thị giống như sau:

ID Sản phẩm

Ngày đặt hàng

Tên công ty

Giao dịch

Mua

Bán

74

22/01/2006

Nhà cung cấp B

Mua

20

0

77

22/01/2006

Nhà cung cấp B

Mua

60

0

80

22/01/2006

Nhà cung cấp D

Mua

75

0

81

22/01/2006

Nhà cung cấp A

Mua

125

0

81

22/01/2006

Nhà cung cấp A

Mua

200

0

7

20/01/2006

Công ty D

Bán

0

10

51

20/01/2006

Công ty D

Bán

0

10

80

20/01/2006

Công ty D

Bán

0

10

34

15/01/2006

Công ty AA

Bán

0

100

80

15/01/2006

Công ty AA

Bán

0

30

Tiếp tục ví dụ này, điều gì sẽ xảy ra nếu bạn muốn các trường có số không là trống? Bạn có thể sửa đổi SQL để không hiển thị gì thay vì số không bằng cách thêm từ khóa Null giống như sau:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Tuy nhiên, khi bạn có thể quan sát việc chuyển đổi sang dạng xem biểu dữ liệu, lúc này bạn đã có một kết quả không mong muốn. Trong cột Mua, mỗi trường đều bị xóa:

ID Sản phẩm

Ngày đặt hàng

Tên công ty

Giao dịch

Mua

Bán

74

22/01/2006

Nhà cung cấp B

Mua

77

22/01/2006

Nhà cung cấp B

Mua

80

22/01/2006

Nhà cung cấp D

Mua

81

22/01/2006

Nhà cung cấp A

Mua

81

22/01/2006

Nhà cung cấp A

Mua

7

20/01/2006

Công ty D

Bán

10

51

20/01/2006

Công ty D

Bán

10

80

20/01/2006

Công ty D

Bán

10

34

15/01/2006

Công ty AA

Bán

100

80

15/01/2006

Công ty AA

Bán

30

Lý do mà điều này xảy ra là vì Access xác định loại dữ liệu của các trường từ truy vấn đầu tiên. Trong ví dụ này, Null không phải là một số.

Vì vậy, điều gì xảy ra nếu bạn tìm cách và chèn một chuỗi trống cho giá trị của các trường trống? SQL đối với nỗ lực này có thể có dạng như sau:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Khi bạn chuyển đổi sang dạng xem biểu dữ liệu, bạn sẽ thấy rằng Access truy xuất các giá trị Mua nhưng đã chuyển đổi các giá trị này thành văn bản. Bạn có thể biết đây là giá trị văn bản vì được căn trái ở dạng xem biểu dữ liệu. Chuỗi trống trong truy vấn đầu tiên không phải là số là vì bạn thấy các kết quả này. Bạn cũng sẽ nhận thấy rằng các giá trị Bán cũng được chuyển đổi thành văn bản vì các bản ghi mua có chứa chuỗi trống.

ID Sản phẩm

Ngày đặt hàng

Tên công ty

Giao dịch

Mua

Bán

74

22/01/2006

Nhà cung cấp B

Mua

20

77

22/01/2006

Nhà cung cấp B

Mua

60

80

22/01/2006

Nhà cung cấp D

Mua

75

81

22/01/2006

Nhà cung cấp A

Mua

125

81

22/01/2006

Nhà cung cấp A

Mua

200

7

20/01/2006

Công ty D

Bán

10

51

20/01/2006

Công ty D

Bán

10

80

20/01/2006

Công ty D

Bán

10

34

15/01/2006

Công ty AA

Bán

100

80

15/01/2006

Công ty AA

Bán

30

Vật thì bạn giải quyết vấn đề này như thế nào?

Giải pháp là buộc truy vấn có giá trị trường là một số. Điều đó có thể được thực hiện bằng biểu thức:

IIf(False, 0, Null)

Điều kiện để kiểm tra, False, sẽ không bao giờ là True, do đó biểu thức sẽ luôn trả về Null nhưng Access vẫn đánh giá cả hai tùy chọn đầu ra và quyết định đầu ra là số hoặc Null.

Đây là cách chúng ta có thể sử dụng biểu thức này trong ví dụ hoạt động của mình:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Lưu ý rằng không cần thiết sửa đổi truy vấn thứ hai.

Nếu bạn chuyển đổi sang dạng xem biểu dữ liệu, lúc này bạn sẽ thấy kết quả mà chúng ta mong muốn:

ID Sản phẩm

Ngày đặt hàng

Tên công ty

Giao dịch

Mua

Bán

74

22/01/2006

Nhà cung cấp B

Mua

20

77

22/01/2006

Nhà cung cấp B

Mua

60

80

22/01/2006

Nhà cung cấp D

Mua

75

81

22/01/2006

Nhà cung cấp A

Mua

125

81

22/01/2006

Nhà cung cấp A

Mua

200

7

20/01/2006

Công ty D

Bán

10

51

20/01/2006

Công ty D

Bán

10

80

20/01/2006

Công ty D

Bán

10

34

15/01/2006

Công ty AA

Bán

100

80

15/01/2006

Công ty AA

Bán

30

Phương pháp thay thế để đạt được cùng một kết quả là thêm các truy vấn trong truy vấn hợp với một truy vấn khác:

SELECT 
    0 As [Product ID], Date() As [Order Date], 
    "" As [Company Name], "" As [Transaction], 
    0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

Đối với từng trường, Access trả về các giá trị cố định của loại dữ liệu bạn xác định. Tất nhiên, bạn không muốn đầu ra của truy vấn này gây cản trở đến kết quả, do đó bí kíp để tránh điều này là thêm vào mệnh đề WHERE thành False:

WHERE False

Đây là một bí kíp nhỏ vì kết quả luôn là false và sau đó truy vấn không trả về bất kỳ giá trị nào. Kết hợp câu lệnh này với SQL hiện có và chúng ta có được câu lệnh được hoàn thành như sau:

SELECT 
    0 As [Product ID], Date() As [Order Date], 
    "" As [Company Name], "" As [Transaction], 
    0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

UNION

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Lưu ý: Truy vấn đã kết hợp ở đây trong ví dụ này sử dụng cơ sở dữ liệu Northwind trả về 100 bản ghi, trong khi hai truy vấn riêng lẻ trả về 58 và 43 bản ghi có tổng cộng là 101 bản ghi. Nguyên nhân về sự không thống nhất này là vì hai bản ghi không phải là duy nhất. Hãy xem mục, Làm việc với các bản ghi riêng biệt trong truy vấn hợp bằng UNION ALL, để tìm hiểu cách để giải quyết kịch bản này bằng cách sử dụng UNION ALL.

Một trường hợp đặc biệt về truy vấn hợp là kết hợp một bộ các bản ghi có một bản ghi chứa tổng của một hoặc nhiều trường.

Đây là một ví dụ khác mà bạn có thể tạo trong cơ sở dữ liệu mẫu Northwind để minh họa cách nhận tổng trong truy vấn hợp.

  1. Tạo một truy vấn đơn giản mới để xem phần mua bia (ID Sản phẩm=34 trong cơ sở dữ liệu Northwind) bằng cú pháp SQL sau đây:

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
  2. Chuyển đổi sang dạng xem biểu dữ liệu và bạn sẽ thấy bốn sản phẩm mua:

    Ngày nhận

    Số lượng

    22/01/2006

    100

    22/01/2006

    60

    04/04/2006

    50

    05/04/2006

    300

  3. Để có được tổng, tạo một truy vấn tổng hợp đơn giản bằng SQL sau đây:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
  4. Chuyển đổi sang dạng xem biểu dữ liệu và bạn sẽ chỉ thấy một bản ghi:

    Ngày nhận_tối_đa

    Tổng_số_lượng

    05/04/2006

    510

  5. Kết hợp hai truy vấn này vào một truy vấn hợp để chắp thêm bản ghi có số lượng tổng vào các bản ghi mua:

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    UNION
    
    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
  6. Chuyển đổi sang dạng xem biểu dữ liệu và bạn sẽ thấy bốn sản phẩm mua có tổng của từng sản phẩm kèm theo là một bản ghi tính tổng số lượng:

    Ngày nhận

    Số lượng

    22/01/2006

    60

    22/01/2006

    100

    04/04/2006

    50

    05/04/2006

    300

    05/04/2006

    510

Bài viết đó đề cập đến những thông tin cơ bản về cách thêm tổng vào một truy vấn hợp. Bạn có thể cũng muốn đưa vào các giá trị cố định trong cả hai truy vấn chẳng hạn như “Chi tiết” và “Tổng” để phân tách trực quan bản ghi tổng từ các bản ghi khác. Bạn có thể xem lại các giá trị cố định đang sử dụng trong mục Kết hợp ba hoặc nhiều bảng hoặc truy vấn trong truy vấn hợp.

Các truy vấn hợp trong Access theo mặc định chỉ bao gồm các bản ghi riêng biệt. Nhưng điều gì sẽ xảy ra nếu bạn muốn bao gồm tất cả bản ghi? Một ví dụ khác có thể hữu ích ở đây.

Trong mục trước đó, chúng tôi đã chỉ cho bạn cách tạo tổng trong truy vấn hợp. Sửa đổi truy vấn hợp SQL đó để có ID Sản phẩm= 48:

SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION

SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Purchase Order Details].[Date Received];

Chuyển đổi sang dạng xem biểu dữ liệu và bạn sẽ thấy kết quả hơi sai khác một chút:

Ngày nhận

Số lượng

22/01/2006

100

22/01/2006

200

Dĩ nhiên, một bản ghi sẽ không trả về hai lần số lượng tổng.

Lý do bạn thấy kết quả này là vì trong một ngày cùng một lượng sôcôla đã được bán hai lần - như được ghi lại trong bảng Chi tiết đơn đặt hàng. Đây là kết quả truy vấn chọn đơn giản hiển thị cả hai bản ghi trong cơ sở dữ liệu mẫu Northwind:

ID Đơn đặt hàng

Product

Quantity

100

Northwind Traders Chocolate

100

92

Northwind Traders Chocolate

100

Trong truy vấn hợp được ghi chú trước, bạn có thể thấy rằng trường ID Đơn hàng không được đưa vào và hai trường không tạo thành hai bản ghi riêng biệt.

Nếu bạn muốn đưa tất cả bản ghi vào, hãy sử dụng UNION ALL thay vì UNION trong SQL của mình. Điều này chủ yếu có thể sẽ gây ảnh hưởng về việc sắp xếp kết quả, vì vậy bạn có thể cũng muốn đưa vào mệnh đề ORDER BY để xác định thứ tự sắp xếp. Đây là cách dựng SQL đã sửa đổi từ ví dụ trước đó:

SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION ALL

SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Total];

Chuyển đổi sang dạng xem biểu dữ liệu và bạn sẽ thấy tất cả các chi tiết ngoài tổng dưới dạng bản ghi cuối cùng:

Ngày nhận

Tổng

Số lượng

22/01/2006

100

22/01/2006

100

22/01/2006

Tổng cộng

200

Mức sử dụng phổ biến về truy vấn hợp đóng vai trò là nguồn bản ghi cho điều khiển hộp tổ hợp trên biểu mẫu. Bạn có thể sử dụng hộp tổ hợp đó để chọn một giá trị cần lọc các bản ghi của biểu mẫu. Ví dụ: lọc bản ghi nhân viên theo thành phố.

Để xem cách hoạt động, đây là một ví dụ khác mà bạn có thể tạo trong cơ sở dữ liệu mẫu Northwind để minh họa kịch bản này.

  1. Tạo truy vấn chọn đơn giản bằng cú pháp SQL này:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. Chuyển đổi sang dạng xem biểu dữ liệu và bạn sẽ thấy kết quả như sau:

    Thành phố

    Bộ lọc

    Seattle

    Seattle

    Bellevue

    Bellevue

    Redmond

    Redmond

    Kirkland

    Kirkland

    Seattle

    Seattle

    Redmond

    Redmond

    Seattle

    Seattle

    Redmond

    Redmond

    Seattle

    Seattle

  3. Đang xem các kết quả mà bạn có thể không thấy nhiều giá trị. Bung rộng truy vấn toàn bộ và biến đổi thành truy vấn hợp bằng cách sử dụng SQL sau đây:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. Chuyển đổi sang dạng xem biểu dữ liệu và bạn sẽ thấy kết quả như sau:

    Thành phố

    Bộ lọc

    <Tất cả>

    *

    Bellevue

    Bellevue

    Kirkland

    Kirkland

    Redmond

    Redmond

    Seattle

    Seattle

    Access sẽ thực hiện kết hợp chín bản ghi, được hiển thị trước đó, có các giá trị cố định là <Tất cả> và "*".

    Vì mệnh đề kết hợp này không chứa UNION ALL, Access sẽ chỉ trả về các bản ghi riêng biệt có nghĩa là từng thành phố được trả về chỉ một lần với các giá trị cố định giống nhau.

  5. Lúc này, bạn có một truy vấn hợp đã hoàn thành hiển thị mỗi tên thành phố chỉ một lần, cùng với một tùy chọn sẽ chọn tất cả các thành phố một cách hiệu quả, bạn có thể sử dụng truy vấn này làm nguồn bản ghi cho hộp tổ hợp trên biểu mẫu. Sử dụng ví dụ cụ thể này làm mô hình, bạn có thể tạo điều khiển hộp tổ hợp trên biểu mẫu, đặt truy vấn này làm nguồn bản ghi, đặt thuộc tính Column Width của Cột bộ lọc thành 0 (số không) để ẩn một cách trực quan, rồi đặt thuộc tính Bound Column thành 1 để chỉ báo các chỉ mục của cột thứ hai. Trong thuộc tính Filter của bản thân biểu mẫu, bạn có thể thêm vào mã chẳng hạn như mã sau đây để kích hoạt bộ lọc biểu mẫu bằng giá trị của những gì đã được chọn trong điều khiển hộp tổ hợp:

    Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'"
    Me.FilterOn = True

    Sau đó, người dùng của biểu mẫu có thể lọc các bản ghi biểu mẫu thành tên thành phố cụ thể hoặc chọn <Tất cả> để liệt kê tất cả bản ghi cho tất cả thành phố.

Đầu Trang

Bạn cần thêm trợ giúp?

Bạn muốn xem các tùy chọn khác?

Khám phá các lợi ích của gói đăng ký, xem qua các khóa đào tạo, tìm hiểu cách bảo mật thiết bị của bạn và hơn thế nữa.

Cộng đồng giúp bạn đặt và trả lời các câu hỏi, cung cấp phản hồi và lắng nghe ý kiến từ các chuyên gia có kiến thức phong phú.