ในบางครั้งคุณอาจต้องการแสดงรายการระเบียนจากตารางหรือคิวรีหนึ่งกับระเบียนจากตารางอื่นอย่างน้อยหนึ่งตารางเพื่อสร้างชุดระเบียน ซึ่งเป็นรายการที่มีระเบียนทั้งหมดจากตารางอย่างน้อยสองตาราง นี่คือวัตถุประสงค์ของคิวรีแบบร่วมใน Access
เมื่อต้องการทำความเข้าใจคิวรีแบบร่วมอย่างมีประสิทธิภาพ คุณควรทำความคุ้นเคยกับการออกแบบคิวรีแบบใช้เลือกข้อมูลพื้นฐานใน Access ก่อน เมื่อต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการออกแบบคิวรีแบบใช้เลือกข้อมูล ให้ดู สร้างคิวรีแบบใช้เลือกข้อมูลอย่างง่าย
หมายเหตุ: เนื้อหาในบทความนี้มีไว้ใช้กับฐานข้อมูล Access บนเดสก์ท็อป คุณไม่สามารถสร้างหรือใช้คิวรีแบบร่วมในฐานข้อมูล Access บนเว็บ หรือ Access Web App ได้
ศึกษาตัวอย่างคิวรีแบบร่วมที่ทำงานอยู่
ถ้าคุณไม่เคยสร้างคิวรีแบบร่วมมาก่อน คุณอาจพบว่า ควรศึกษาตัวอย่างการทำงานในเทมเพลต Northwind Access ก่อน คุณสามารถค้นหาเทมเพลตตัวอย่าง Northwind บนหน้าการเริ่มต้นใช้งานของ Access ด้วยการคลิก ไฟล์ > ใหม่ หรือคุณสามารถดาวน์โหลดสำเนาจากตำแหน่งที่ตั้งนี้ได้โดยตรง: เทมเพลตตัวอย่าง Northwind
หลังจากที่ Access เปิดฐานข้อมูล Northwind ให้ยกเลิกฟอร์มกล่องโต้ตอบการเข้าสู่ระบบที่ปรากฏขึ้นก่อน จากนั้นขยายบานนหน้าต่างนำทาง คลิกที่ด้านบนของบานหน้าต่างนำทาง แล้วเลือก ชนิดวัตถุ เพื่อจัดระเบียบวัตถุฐานข้อมูลทั้งหมดตามชนิด ถัดไป ให้ขยายกลุ่ม คิวรี และคุณจะเห็นคิวรีที่เรียกว่า ธุรกรรมของสินค้า
สามารถแยกความแตกต่างคิวรีแบบร่วมจากวัตถุคิวรีอื่นๆ ได้อย่างง่ายดายเนื่องจากมีไอคอนพิเศษที่คล้ายคลึงกับวงกลมที่พันกันสองวง ซึ่งแสดงถึงชุดรวมกันจากสองชุด:

ไม่เหมือนกับคิวรีแบบใช้เลือกข้อมูลและคิวรีแอคชันปกติ ตารางจะไม่เกี่ยวข้องกับคิวรีแบบร่วม ซึ่งหมายความว่า ไม่สามารถใช้ตัวออกแบบคิวรีกราฟิกของ Access ในการสร้างหรือแก้ไขคิวรีแบบร่วมได้ คุณจะพบปัญหานี้ถ้าคุณเปิดคิวรีแบบร่วมจากบานหน้าต่างนำทาง Access จะเปิดและแสดงผลลัพธ์ในมุมมองแผ่นข้อมูล ภายใต้คำสั่ง มุมมอง บนแท็บ หน้าแรก คุณจะสังเกตเห็นว่า มุมมองออกแบบ ไม่พร้อมใช้งานเมื่อคุณทำงานกับคิวรีแบบร่วม คุณสามารถสลับระหว่าง มุมมองแผ่นงาน และ มุมมอง SQL เท่านั้นเมื่อทำงานกับคิวรีแบบร่วม
เมื่อต้องการศึกษาตัวอย่างคิวรีแบบร่วมนี้ต่อ ให้คลิก หน้าแรก > มุมมอง > มุมมอง SQL เพื่อดูไวยากรณ์ SQL ที่กำหนดคิวรี ในภาพประกอบนี้ เราได้เพิ่มช่องว่างเพิ่มเติมใน SQL เพื่อให้คุณสามารถดูส่วนต่างๆ ที่สร้างคิวรีแบบร่วม

ลองศึกษาไวยากรณ์ SQL ของคิวรีแบบร่วมนี้จากฐานข้อมูล 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;
ส่วนแรกและส่วนที่สามของคำสั่ง SQL นี้เป็นคิวรีแบบใช้เลือกข้อมูลสองคิวรี คิวรีเหล่านี้เรียกใช้ระเบียนที่แตกต่างกันสองชุด ชุดหนึ่งจากตาราง ใบสั่งผลิตภัณฑ์ และชุดหนึ่งจากตาราง การสั่งซื้อผลิตภัณฑ์
ส่วนที่สองของคำสั่ง SQL นี้เป็นคำสำคัญ UNION ซึ่งบอก Access ว่า คิวรีนี้จะรวมระเบียนสองชุดนั้น
ส่วนสุดท้ายของคำสั่ง SQL นี้กำหนดลำดับของระเบียนรวมโดยใช้คำสั่ง ORDER BY ในตัวอย่างนี้ Access จะจัดลำดับระเบียนทั้งหมดตามเขตข้อมูลวันที่สั่งซื้อตามลำดับจากมากไปหาน้อย
หมายเหตุ: คิวรีแบบร่วมจะเป็นแบบอ่านอย่างเดียวเสมอใน Access คุณไม่สามารถเปลี่ยนค่าใดๆ ในมุมมองแผ่นข้อมูล
สร้างคิวรีแบบร่วมโดยการสร้างและรวมคิวรีแบบใช้เลือกข้อมูล
แม้ว่าคุณสามารถสร้างคิวรีแบบร่วมโดยการเขียนไวยากรณ์ SQL โดยตรงในมุมมอง SQL คุณอาจพบว่า สร้างในส่วนได้ง่ายขึ้นด้วยคิวรีแบบใช้เลือกข้อมูล คุณสามารถคัดลอกและวางส่วน SQL ลงในคิวรีแบบร่วม
ถ้าคุณต้องการข้ามการอ่านขั้นตอน และดูตัวอย่างแทน ให้ดูส่วนถัดไป ดูตัวอย่างของการสร้างคิวรีแบบร่วม
-
บนแท็บ สร้าง ในกลุ่ม คิวรี ให้คลิก ออกแบบคิวรี
-
ในกล่องโต้ตอบ แสดงตาราง ให้ดับเบิลคลิกที่ตารางซึ่งมีเขตข้อมูลที่คุณต้องการรวมไว้ ตารางจะถูกเพิ่มลงในหน้าต่างการออกแบบคิวรี
-
ปิดกล่องโต้ตอบ แสดงตาราง
-
ในหน้าต่างการออกแบบคิวรี ให้ดับเบิลคลิกที่แต่ละเขตข้อมูลที่คุณต้องการรวมไว้ เมื่อคุณเลือกเขตข้อมูล ให้ตรวจสอบให้แน่ใจว่าคุณเพิ่มเขตข้อมูลในจำนวนที่เท่ากันและตามลำดับเดียวกันกับที่คุณเพิ่มในคิวรีแบบใช้เลือกข้อมูลอีกคิวรีหนึ่ง โปรดพิจารณาชนิดข้อมูลของเขตข้อมูลอย่างรอบคอบ และตรวจสอบให้แน่ใจว่าเป็นชนิดข้อมูลที่เข้ากันได้กับเขตข้อมูลในตำแหน่งเดียวกันในคิวรีอื่นที่คุณกำลังรวม ตัวอย่างเช่น ถ้าคิวรีแบบใช้เลือกข้อมูลแรกของคุณมีห้าเขตข้อมูลโดยที่เขตข้อมูลแรกมีข้อมูลวันที่/เวลา โปรดตรวจสอบว่าคิวรีแบบใช้เลือกข้อมูลอื่นๆ ที่คุณรวมนั้นมีห้าเขตข้อมูลเช่นเดียวกันโดยที่เขตข้อมูลแรกมีข้อมูลวันที่/เวลา เป็นต้น
-
อีกทางหนึ่งคือ เพิ่มเกณฑ์ลงในเขตข้อมูลของคุณโดยการพิมพ์นิพจน์ที่เหมาะสมในแถวเกณฑ์ของตารางเขตข้อมูล
-
หลังจากที่คุณเพิ่มเขตข้อมูลและเกณฑ์เขตข้อมูลเสร็จสิ้น คุณควรเรียกใช้คิวรีแบบใช้เลือกข้อมูล และตรวจทานผลลัพธ์ บนแท็บ ออกแบบ ในกลุ่ม ผลลัพธ์ ให้คลิก เรียกใช้
-
สลับคิวรีไปยังมุมมองออกแบบ
-
บันทึกคิวรีแบบใช้เลือกข้อมูล และเปิดทิ้งไว้
-
ทำซ้ำกระบวนการนี้สำหรับแต่ละคิวรีแบบใช้เลือกข้อมูลที่คุณต้องการรวม
หลังจากที่คุณสร้างคิวรีแบบใช้เลือกข้อมูลแล้ว ก็ถึงเวลาที่จะรวมเข้าด้วยกัน ในขั้นตอนนี้ คุณสร้างคิวรีแบบร่วมโดยการคัดลอกและวางคำสั่ง SQL
-
บนแท็บ สร้าง ในกลุ่ม คิวรี ให้คลิก ออกแบบคิวรี
-
ปิดกล่องโต้ตอบ แสดงตาราง
-
บนแท็บ ออกแบบ ในกลุ่ม คิวรี ให้คลิก UNION Access ซ่อนหน้าต่างออกแบบคิวรี และแสดงแท็บวัตถุมุมมอง SQL ในขั้นตอนนี้ แท็บวัตถุมุมมอง SQL จะว่างเปล่า
-
คลิกแท็บสำหรับคิวรีแบบใช้เลือกข้อมูลคิวรีแรกที่คุณต้องการรวมในคิวรีแบบร่วม
-
บนแท็บ หน้าแรก ให้คลิก มุมมอง > มุมมอง SQL
-
คัดลอกคำสั่ง SQL สำหรับคิวรีแบบใช้เลือกข้อมูล คลิกแท็บสำหรับคิวรีแบบร่วมที่คุณได้เริ่มสร้างก่อนหน้านี้
-
วางคำสั่ง SQL สำหรับคิวรีแบบใช้เลือกข้อมูลในแท็บวัตถุมุมมอง SQL ของคิวรีแบบร่วม
-
ลบเครื่องหมายอัฒภาค (;) ที่ท้ายคำสั่ง SQL สำหรับคิวรีแบบใช้เลือกข้อมูล
-
กด Enter เพื่อย้ายเคอร์เซอร์ลงไปหนึ่งบรรทัด แล้วพิมพ์ UNION บนบรรทัดใหม่
-
คลิกแท็บสำหรับคิวรีแบบใช้เลือกข้อมูลคิวรีถัดไปที่คุณต้องการรวมในคิวรีแบบร่วมนี้
-
ทำซ้ำตามขั้นตอนที่ 5 ถึง 10 จนกว่าคุณจะได้คัดลอกและวางคำสั่ง SQL ทั้งหมดสำหรับคิวรีแบบใช้เลือกข้อมูลลงในหน้าต่างมุมมอง SQL ของคิวรีแบบร่วม โปรดอย่าลบเครื่องหมายอัฒภาคหรือพิมพ์ข้อความใดๆ หลังคำสั่ง SQL สำหรับคิวรีแบบใช้เลือกข้อมูลคิวรีสุดท้าย
-
บนแท็บ ออกแบบ ในกลุ่ม ผลลัพธ์ ให้คลิก เรียกใช้
ผลลัพธ์ของคิวรีแบบร่วมของคุณจะปรากฏขึ้นในมุมมองแผ่นข้อมูล
ดูตัวอย่างของการสร้างคิวรีแบบร่วม
ต่อไปนี้คือตัวอย่างที่คุณสามารถสร้างใหม่ในฐานข้อมูลตัวอย่าง Northwind คิวรีแบบร่วมนี้รวบรวมชื่อบุคคลจากตาราง ลูกค้า และรวมกับชื่อบุคคลจากตาราง ผู้จำหน่าย ถ้าคุณต้องการทำตามขั้นตอนต่อไปนี้ ให้ทำตามขั้นตอนเหล่านี้ในสำเนาฐานข้อมูลตัวอย่าง Northwind ของคุณ

ต่อไปนี้คือขั้นตอนที่จำเป็นในการสร้างตัวอย่างนี้:
-
สร้างคิวรีแบบใช้เลือกข้อมูลสองคิวรีที่เรียกว่า Query1 และ Query2 ด้วยตารางลูกค้าและผู้จำหน่ายเป็นแหล่งข้อมูลตามลำดับ ใช้เขตข้อมูลชื่อและนามสกุลเป็นค่าที่แสดง
-
สร้างคิวรีใหม่ที่เรียกว่า Query3 โดยไม่มีแหล่งข้อมูลตั้งแต่เริ่มต้น แล้วคลิกคำสั่ง UNION บนแท็บ ออกแบบ เพื่อใส่คิวรีนี้ลงในคิวรีแบบร่วม
-
คัดลอกและวางคำสั่ง SQL จาก Query1 และ Query2 ลงใน Query3 ให้แน่ใจว่าได้เอาเครื่องหมายอัฒภาคพิเศษออก และเพิ่มคำสำคัญ UNION คุณสามารถตรวจสอบผลลัพธ์ของคุณในมุมมองแผ่นข้อมูล
-
เพิ่มส่วนคำสั่งการสั่งซื้อลงในคิวรีใดคิวรีหนึ่ง แล้ววางคำสั่ง ORDER BY ลงในมุมมอง SQL ของคิวรีแบบร่วม โปรดทราบว่า ใน Query3 คิวรีแบบร่วม เมื่อการสั่งซื้อกำลังจะถูกผนวก เครื่องหมายอัฒภาคจะถูกเอาออกก่อน จากนั้นชื่อตารางจากชื่อเขตข้อมูล
-
SQL สุดท้ายที่รวมและเรียงลำดับชื่อสำหรับตัวอย่างคิวรีแบบร่วมนี้เป็นดังต่อไปนี้:
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];
ถ้าคุณคุ้นเคยกับการเขียนไวยากรณ์ SQL คุณสามารถเขียนคำสั่ง SQL ของคุณเองสำหรับคิวรีแบบร่วมลงมุมมอง SQL ได้โดยตรง อย่างไรก็ตาม คุณอาจพบว่ามีประโยชน์ในการทำตามวิธีการคัดลอกและวาง SQL จากวัตถุคิวรีอื่น แต่ละคิวรีอาจมีความซับซ้อนมากกว่าตัวอย่างคิวรีแบบใช้เลือกข้อมูลอย่างง่ายที่ใช้ที่นี่ ซึ่งอาจเป็นประโยชน์สำหรับคุณในการสร้างและทดสอบแต่ละคิวรีอย่างระมัดระวังก่อนที่จะรวมลงในคิวรีแบบร่วม ถ้าคิวรีแบบร่วมไม่สามารถทำงานได้ คุณสามารถปรับคิวรีแต่ละรายการจนกว่าจะประสบความสำเร็จ แล้วสร้างคิวรีแบบร่วมของคุณใหม่ด้วยไวยากรณ์ที่แก้ไขแล้ว
ตรวจทานส่วนที่เหลือของบทความนี้เพื่อเรียนรู้เคล็ดลับและคำแนะนำเพิ่มเติมเกี่ยวกบการใช้คิวรีแบบร่วม
รวมตารางหรือคิวรีอย่างน้อยสามรายการในคิวรีแบบร่วม
ในตัวอย่างจากส่วนก่อนหน้าที่ใช้ฐานข้อมูล Northwind จะรวมเฉพาะข้อมูลจากสองตารางเท่านั้น อย่างไรก็ตาม คุณสามารถรวมตารางอย่างน้อยสามตารางในคิวรีแบบร่วมได้อย่างง่ายดาย ตัวอย่างเช่น จากตัวอย่างก่อนหน้า คุณอาจต้องการรวมชื่อของ พนักงาน ในผลลัพธ์คิวรีด้วย คุณสามารถทำงานดังกล่าวได้โดยการเพิ่มคิวรีที่สาม และรวมคำสั่ง SQL ก่อนหน้าด้วยคำสำคัญ UNION เพิ่มเติม ดังนี้:
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];
เมื่อคุณดูผลลัพธ์ในมุมมองแผ่นข้อมูล ระบบจะแสดงรายชื่อพนักงานทั้งหมดพร้อมกับชื่อบริษัทตัวอย่าง ซึ่งอาจไม่มีประโยชน์มากนัก ถ้าคุณต้องการให้เขตข้อมูลดังกล่าวระบุว่า บุคคลเป็นพนักงานภายในองค์กร จากผู้จำหน่าย หรือจากลูกค้า คุณสามารถรวม ค่าคงที่ แทนชื่อบริษัท ต่อไปนี้คือลักษณะที่ปรากฏของ 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];
ต่อไปนี้คือลักษณะของผลลัพธ์ในมุมมองแผ่นข้อมูล Access แสดงระเบียนตัวอย่างห้าตัวอย่าง:
การจ้างงาน |
นามสกุล |
ชื่อ |
ภายในองค์กร |
วิลาปนะ |
นันทิดา |
ภายในองค์กร |
คงแสงฉาย |
มาลี |
ผู้จำหน่าย |
สุทธิรัตน์ |
กล้าหาญ |
ลูกค้า |
ศรีวรัญญู |
ดำรง |
ลูกค้า |
พรพิพัฒนพงศ์ |
กิตติกร |
คิวรีด้านบนสามารถลดลงได้มากยิ่งขึ้นเนื่องจาก Access จะอ่านเฉพาะชื่อของเขตข้อมูลผลลัพธ์จากคิวรีแรกในคิวรีแบบร่วม ที่นี่คุณจะเห็นว่า เราได้เอาผลลัพธ์ออกจากส่วนคิวรีที่สองและสาม:
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];
การกรองในคิวรีแบบร่วม
ในคิวรีแบบร่วมของ Access การเรียงลำดับจะได้รับอนุญาตเพียงครั้งเดียว แต่สามารถกรองแต่ละคิวรีแยกกันได้ จากคิวรีแบบร่วมของส่วนก่อนหน้า ต่อไปนี้เป็นตัวอย่างของตำแหน่งที่เราได้กรองแต่ละคิวรีโดยเพิ่มส่วนคำสั่ง ตำแหน่ง
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];
สลับไปยังมุมมองแผ่นข้อมูล และคุณจะเห็นผลลัพธ์ที่คล้ายกับสิ่งนี้:
การจ้างงาน |
นามสกุล |
ชื่อ |
ผู้จำหน่าย |
สุรมงคล |
อรพรรณ |
ภายในองค์กร |
วิลาปนะ |
นันทิดา |
ลูกค้า |
วิจิตรวานิช |
เจตริณ |
ภายในองค์กร |
บุญหลวง |
อัมพร |
ผู้จำหน่าย |
วัฒนา |
อรอนงค์ |
ลูกค้า |
วีรวัตร |
สัญญา |
ผู้จำหน่าย |
ตันตยกุล |
มโน |
ผู้จำหน่าย |
พรพิพัฒนพงศ์ |
กิตติกร |
ภายในองค์กร |
สมวรรณะ |
สุเชาว์ |
ผู้จำหน่าย |
ประภาศิริรัตน์ |
บุษบา |
ภายในองค์กร |
ธรรมานนท์ |
ไชยยนต์ |
การผสมชนิดข้อมูล
ถ้าคิวรีที่จะรวมแตกต่างกันมาก คุณอาจพบสถานการณ์ที่เขตข้อมูลผลลัพธ์ต้องรวมข้อมูลชนิดต่างๆ ถ้าเป็นเช่นนั้น คิวรีแบบร่วมมักจะส่งกลับผลลัพธ์เป็นชนิดข้อมูลข้อความ เนื่องจากชนิดข้อมูลดังกล่าวสามารถเก็บทั้งข้อความ และ ตัวเลข
เมื่อต้องการทำความเข้าใจวิธีการทำงานนี้ เราจะใช้คิวรีแบบร่วม ธุรกรรมของสินค้า ในฐานข้อมูลตัวอย่าง Northwind เปิดฐานข้อมูลตัวอย่าง แล้วเปิดคิวรี ธุรกรรมของสินค้า ในมุมมองแผ่นข้อมูล สิบระเบียนสุดท้ายควรคล้ายกับผลลัพธ์นี้:
รหัสผลิตภัณฑ์ |
วันที่สั่งซื้อ |
ชื่อบริษัท |
ธุรกรรม |
จำนวน |
77 |
22/1/2006 |
ผู้จำหน่าย B |
สั่งซื้อ |
60 |
80 |
22/1/2006 |
ผู้จำหน่าย D |
สั่งซื้อ |
75 |
81 |
22/1/2006 |
ผู้จำหน่าย A |
สั่งซื้อ |
125 |
81 |
22/1/2006 |
ผู้จำหน่าย A |
สั่งซื้อ |
200 |
7 |
20/1/2006 |
บริษัท D |
การขาย |
10 |
51 |
20/1/2006 |
บริษัท D |
การขาย |
10 |
80 |
20/1/2006 |
บริษัท D |
การขาย |
10 |
34 |
15/1/2006 |
บริษัท AA |
การขาย |
100 |
80 |
15/1/2006 |
บริษัท AA |
การขาย |
30 |
ลองสมมติว่า คุณต้องการแยกเขตข้อมูลจำนวนเป็นสองส่วน ได้แก่ ซื้อและขาย สมมติว่า คุณต้องการให้มีค่าศูนย์คงที่สำหรับเขตข้อมูลที่ไม่มีค่า ต่อไปนี้คือลักษณะที่ปรากฏของ SQL สำหรับคิวรีแบบร่วมนี้:
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;
ถ้าคุณสลับไปยังมุมมองแผ่นข้อมูล คุณจะเห็นสิบระเบียนสุดท้ายแสดงดังต่อไปนี้:
รหัสผลิตภัณฑ์ |
วันที่สั่งซื้อ |
ชื่อบริษัท |
ธุรกรรม |
ซื้อ |
ขาย |
74 |
22/1/2006 |
ผู้จำหน่าย B |
สั่งซื้อ |
20 |
0 |
77 |
22/1/2006 |
ผู้จำหน่าย B |
สั่งซื้อ |
60 |
0 |
80 |
22/1/2006 |
ผู้จำหน่าย D |
สั่งซื้อ |
75 |
0 |
81 |
22/1/2006 |
ผู้จำหน่าย A |
สั่งซื้อ |
125 |
0 |
81 |
22/1/2006 |
ผู้จำหน่าย A |
สั่งซื้อ |
200 |
0 |
7 |
20/1/2006 |
บริษัท D |
การขาย |
0 |
10 |
51 |
20/1/2006 |
บริษัท D |
การขาย |
0 |
10 |
80 |
20/1/2006 |
บริษัท D |
การขาย |
0 |
10 |
34 |
15/1/2006 |
บริษัท AA |
การขาย |
0 |
100 |
80 |
15/1/2006 |
บริษัท AA |
การขาย |
0 |
30 |
ดูตัวอย่างต่อ จะเกิดอะไรขึ้นถ้าถ้าคุณต้องการให้เขตข้อมูลที่มีค่าศูนย์ว่างเปล่า คุณสามารถปรับเปลี่ยน SQL เพื่อไม่แสดงแทนค่าศูนย์ โดยการเพิ่มคำสำคัญ Null ดังต่อไปนี้:
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;
อย่างไรก็ตาม คุณอาจเห็นการสลับไปยังมุมมองแผ่นข้อมูล ขณะนี้คุณมีผลลัพธ์ที่ไม่คาดคิด ในคอลัมน์ซื้อ เขตข้อมูลทั้งหมดจะถูกล้าง:
รหัสผลิตภัณฑ์ |
วันที่สั่งซื้อ |
ชื่อบริษัท |
ธุรกรรม |
ซื้อ |
ขาย |
74 |
22/1/2006 |
ผู้จำหน่าย B |
สั่งซื้อ |
|
|
77 |
22/1/2006 |
ผู้จำหน่าย B |
สั่งซื้อ |
|
|
80 |
22/1/2006 |
ผู้จำหน่าย D |
สั่งซื้อ |
|
|
81 |
22/1/2006 |
ผู้จำหน่าย A |
สั่งซื้อ |
|
|
81 |
22/1/2006 |
ผู้จำหน่าย A |
สั่งซื้อ |
|
|
7 |
20/1/2006 |
บริษัท D |
การขาย |
|
10 |
51 |
20/1/2006 |
บริษัท D |
การขาย |
|
10 |
80 |
20/1/2006 |
บริษัท D |
การขาย |
|
10 |
34 |
15/1/2006 |
บริษัท AA |
การขาย |
|
100 |
80 |
15/1/2006 |
บริษัท AA |
การขาย |
|
30 |
เกิดเหตุการณ์นี้ขึ้นเพราะ Access กำหนดชนิดข้อมูลของเขตข้อมูลจากคิวรีแรก ในตัวอย่างนี้ Null ไม่ใช่ตัวเลข
ดังนั้นจะเกิดอะไรขึ้นถ้าคุณพยายามแทรกสตริงว่างสำหรับค่าว่างของเขตข้อมูล SQL สำหรับความพยายามนี้อาจมีลักษณะดังต่อไปนี้:
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;
เมื่อคุณสลับไปยังมุมมองแผ่นข้อมูล คุณจะเห็น Access เรียกใช้ค่าซื้อ แต่แปลงค่าเป็นข้อความ คุณสามารถบอกได้ว่า เป็นค่าข้อความเนื่องจากจัดชิดซ้ายในมุมมองแผ่นข้อมูล สตริงว่างในคิวรีแรกไม่ใช่ตัวเลข ซึ่งเป็นสาเหตุที่คุณเห็นผลลัพธ์เหล่านี้ นอกจากนี้คุณจะเห็นว่าค่าซื้อยังแปลงเป็นข้อความเนื่องจากระเบียนการซื้อมีสตริงว่าง
รหัสผลิตภัณฑ์ |
วันที่สั่งซื้อ |
ชื่อบริษัท |
ธุรกรรม |
ซื้อ |
ขาย |
74 |
22/1/2006 |
ผู้จำหน่าย B |
สั่งซื้อ |
20 |
|
77 |
22/1/2006 |
ผู้จำหน่าย B |
สั่งซื้อ |
60 |
|
80 |
22/1/2006 |
ผู้จำหน่าย D |
สั่งซื้อ |
75 |
|
81 |
22/1/2006 |
ผู้จำหน่าย A |
สั่งซื้อ |
125 |
|
81 |
22/1/2006 |
ผู้จำหน่าย A |
สั่งซื้อ |
200 |
|
7 |
20/1/2006 |
บริษัท D |
การขาย |
|
10 |
51 |
20/1/2006 |
บริษัท D |
การขาย |
|
10 |
80 |
20/1/2006 |
บริษัท D |
การขาย |
|
10 |
34 |
15/1/2006 |
บริษัท AA |
การขาย |
|
100 |
80 |
15/1/2006 |
บริษัท AA |
การขาย |
|
30 |
คุณแก้ไขปัญหานี้อย่างไร
วิธีแก้ไขปัญหาคือ การบังคับคิวรีให้คาดว่าค่าเขตข้อมูลเป็นตัวเลข ซึ่งสามารถดำเนินการได้ด้วยนิพจน์:
IIf(False, 0, Null)
เงื่อนไขในการตรวจสอบ เท็จ จะไม่มีวันเป็น จริง ดังนั้นนิพจน์จะส่งกลับ Null เสมอ แต่ Access จะยังประเมินตัวเลือกผลลัพธ์ทั้งสองอย่าง และกำหนดให้ผลลัพธ์เป็นตัวเลขหรือ Null
ต่อไปนี้คือวิธีที่เราสามารถใช้นิพจน์นี้ในตัวอย่างการทำงานของเรา:
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;
โปรดทราบว่า ไม่จำเป็นต้องปรับเปลี่ยนคิวรีที่สอง
ถ้าคุณสลับไปยังมุมมองแผ่นข้อมูล คุณจะเห็นผลลัพธ์ที่เราต้องการ:
รหัสผลิตภัณฑ์ |
วันที่สั่งซื้อ |
ชื่อบริษัท |
ธุรกรรม |
ซื้อ |
ขาย |
74 |
22/1/2006 |
ผู้จำหน่าย B |
สั่งซื้อ |
20 |
|
77 |
22/1/2006 |
ผู้จำหน่าย B |
สั่งซื้อ |
60 |
|
80 |
22/1/2006 |
ผู้จำหน่าย D |
สั่งซื้อ |
75 |
|
81 |
22/1/2006 |
ผู้จำหน่าย A |
สั่งซื้อ |
125 |
|
81 |
22/1/2006 |
ผู้จำหน่าย A |
สั่งซื้อ |
200 |
|
7 |
20/1/2006 |
บริษัท D |
การขาย |
|
10 |
51 |
20/1/2006 |
บริษัท D |
การขาย |
|
10 |
80 |
20/1/2006 |
บริษัท D |
การขาย |
|
10 |
34 |
15/1/2006 |
บริษัท AA |
การขาย |
|
100 |
80 |
15/1/2006 |
บริษัท AA |
การขาย |
|
30 |
อีกวิธีหนึ่งเพื่อให้ได้ผลลัพธ์เหมือนกันคือ ขึ้นต้นคิวรีในคิวรีแบบร่วมด้วยคิวรีอื่น:
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
สำหรับแต่ละเขตข้อมูล Access จะส่งกลับค่าคงที่ของชนิดข้อมูลที่คุณกำหนด แน่นอนว่า คุณไม่ต้องการให้ผลลัพธ์ของคิวรีนี้ขัดแย้งกับผลลัพธ์ ดังนั้นเคล็ดลับในการหลีกเลี่ยงปัญหาดังกล่าวคือ รวมส่วนคำสั่ง ตำแหน่ง เป็นเท็จ:
WHERE False
นี่เป็นเคล็ดลับเล็กๆ น้อยๆ เนื่องจากมักเป็นเท็จเสมอ แล้วคิวรีจะไม่ส่งกลับผลใดๆ รวมคำสั่งนี้กับ SQL ที่มีอยู่ แล้วเราจะได้คำสั่งที่เสร็จสมบูรณ์ดังต่อไปนี้:
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;
หมายเหตุ: คิวรีรวมต่อไปนี้ในตัวอย่างนี้ที่ใช้ฐานข้อมูล Northwind ส่งกลับระเบียน 100 รายการ ขณะที่สองคิวรีส่งกลับระเบียน 58 รายการและ 43 รายการสำหรับระเบียนทั้งหมด 101 รายการ สาเหตุสำหรับความขัดแย้งนี้เป็นเพราะสองระเบียนไม่ซ้ำกัน ดูส่วน ทำงานกับระเบียนเฉพาะในคิวรีแบบร่วมโดยใช้ UNION ALL เมื่อต้องการเรียนรู้วิธีแก้ไขสถานการณ์นี้โดยใช้ UNION ALL
การเพิ่มผลรวมในคิวรีแบบร่วม
กรณีพิเศษสำหรับคิวรีแบบร่วมคือ การรวมชุดระเบียนกับระเบียนหนึ่งที่มีผลรวมของเขตข้อมูลอย่างน้อยหนึ่งเขต
ต่อไปนี้คืออีกตัวอย่างหนึ่งที่คุณสามารถสร้างในฐานข้อมูลตัวอย่าง Northwind เพื่อแสดงวิธีการหาผลรวมในคิวรีแบบร่วม
-
สร้างคิวรีแบบง่ายใหม่เพื่อดูการซื้อเบียร์ (รหัสผลิตภัณฑ์=34 ในฐานข้อมูล Northwind) โดยใช้ไวยากรณ์ SQL ต่อไปนี้:
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];
-
สลับไปยังมุมมองแผ่นข้อมูล และคุณจะเห็นการซื้อสี่รายการ:
วันที่ได้รับ
จำนวน
22/1/2006
100
22/1/2006
60
4/4/2006
50
5/4/2006
300
-
เมื่อต้องการดูผลรวม ให้สร้างคิวรีการรวมอย่างง่ายโดยใช้ SQL ต่อไปนี้:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
สลับไปยังมุมมองแผ่นข้อมูล และคุณจะเห็นเพียงระเบียนเดียว:
วันที่สูงสุดที่ได้รับ
ยอดรวมจำนวน
5/4/2006
510
-
รวมสองคิวรีนี้ลงในคิวรีแบบร่วมเพื่อผนวกระเบียนด้วยจำนวนรวมกับระเบียนการซื้อ:
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];
-
สลับไปยังมุมมองแผ่นข้อมูล และคุณจะเห็นการซื้อสี่รายการที่มีผลรวมของแต่ละรายการตามด้วยระเบียนที่มีจำนวนรวม:
วันที่ได้รับ
จำนวน
22/1/2006
60
22/1/2006
100
4/4/2006
50
5/4/2006
300
5/4/2006
510
ซึ่งครอบคลุมพื้นฐานของการเพิ่มผลรวมลงในคิวรีแบบร่วม คุณอาจยังต้องการรวมค่าคงที่ในทั้งสองคิวรี เช่น "รายละเอียด" และ "ผลรวม" เพื่อแยกระเบียนผลรวมจากระเบียนอื่นๆ คุณสามารถตรวจทานโดยใช้ค่าคงที่ในส่วน รวมตารางหรือคิวรีอย่างน้อยสามรายการในคิวรีแบบร่วม
ทำงานกับระเบียนเฉพาะในคิวรีแบบร่วมโดยใช้ UNION ALL
คิวรีแบบร่วมใน Access ตามค่าเริ่มต้นจะรวมระเบียนเฉพาะเท่านั้น แต่จะเกิดอะไรขึ้นถ้าคุณต้องการรวมระเบียนทั้งหมด อีกตัวอย่างหนึ่งอาจเป็นประโยชน์ที่นี่
ในส่วนก่อนหน้า เราได้แสดงวิธีการสร้างผลรวมในคิวรีแบบร่วมให้คุณดู ปรับเปลี่ยน SQL ของคิวรีแบบร่วมเพื่อรวมรหัสผลิตภัณฑ์=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];
สลับไปยังมุมมองแผ่นข้อมูล และคุณจะเห็นผลลัพธ์ที่อาจทำให้เกิดการเข้าใจผิด:
วันที่ได้รับ |
จำนวน |
22/1/2006 |
100 |
22/1/2006 |
200 |
ระเบียนหนึ่งจะไม่ส่งกลับจำนวนเป็นสองเท่า
เหตุผลที่คุณเห็นผลลัพธ์นี้เป็นเพราะในหนึ่งวัน จำนวนช็อกโกแลตเดียวกันถูกขายสองครั้ง ตามที่บันทึกไว้ในตารางรายละเอียดใบสั่งผลิตภัณฑ์ ต่อไปนี้เป็นผลลัพธ์ของคิวรีแบบใช้เลือกข้อมูลอย่างง่าย แสดงทั้งสองระเบียนในฐานข้อมูลตัวอย่าง Northwind
รหัสใบสั่งผลิตภัณฑ์ |
ผลิตภัณฑ์ |
จำนวน |
100 |
Northwind Traders Chocolate |
100 |
92 |
Northwind Traders Chocolate |
100 |
ในคิวรีแบบร่วมที่ระบุไว้ก่อนหน้านี้ คุณสามารถเห็นได้ว่า ไม่มีเขตข้อมูลรหัสใบสั่งผลิตภัณฑ์ และเขตข้อมูลทั้งสองไม่ได้สร้างระเบียนเฉพาะสองระเบียน
ถ้าคุณต้องการรวมระเบียนทั้งหมด ให้ใช้ UNION ALL แทน UNION ใน SQL ของคุณ ซึ่งส่วนใหญ่จะมีผลต่อการเรียงลำดับผลลัพธ์ ดังนั้นคุณอาจต้องการรวมส่วนคำสั่ง ORDER BY เพื่อกำหนดลำดับการจัดเรียง ต่อไปนี้คือ SQL ที่แก้ไขจากตัวอย่างก่อนหน้า:
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];
สลับไปยังมุมมองแผ่นข้อมูล และคุณจะเห็นรายละเอียดทั้งหมดนอกเหนือจากผลรวมเป็นระเบียนสุดท้าย
วันที่ได้รับ |
ผลรวม |
จำนวน |
22/1/2006 |
|
100 |
22/1/2006 |
|
100 |
22/1/2006 |
ผลรวม |
200 |
ใช้คิวรีแบบร่วมเพื่อกรองระเบียนบนฟอร์มผ่านตัวควบคุมกล่องคำสั่งผสม
การใช้งานทั่วไปสำหรับคิวรีแบบร่วมคือ ทำหน้าที่เป็นแหล่งระเบียนสำหรับตัวควบคุมกล่องคำสั่งผสมบนฟอร์ม คุณสามารถใช้กล่องคำสั่งผสมนั้นเพื่อเลือกค่าที่จะกรองระเบียนของฟอร์ม ตัวอย่างเช่น กรองระเบียนพนักงานตามเมือง
เมื่อต้องการดูวิธีการทำงานนี้ ต่อไปนี้คืออีกตัวอย่างที่คุณสามารถสร้างในฐานข้อมูลตัวอย่าง Northwind เพื่อแสดงสถานการณ์นี้
-
สร้างคิวรีแบบใช้เลือกข้อมูลอย่างง่ายโดยใช้ไวยากรณ์ SQL นี้:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
สลับมุมมองแผ่นข้อมูล และคุณจะเห็นผลลัพธ์ต่อไปนี้:
เมือง
ตัวกรอง
ซีแอตเทิล
ซีแอตเทิล
เบลวิว
เบลวิว
เรดมอนด์
เรดมอนด์
เคิร์กแลนด์
เคิร์กแลนด์
ซีแอตเทิล
ซีแอตเทิล
เรดมอนด์
เรดมอนด์
ซีแอตเทิล
ซีแอตเทิล
เรดมอนด์
เรดมอนด์
ซีแอตเทิล
ซีแอตเทิล
-
เมื่อดูผลลัพธ์เหล่านั้น คุณอาจไม่เห็นหลายค่า ขยายคิวรี และแปลงเป็นคิวรีแบบร่วมโดยใช้ SQL ต่อไปนี้:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
สลับมุมมองแผ่นข้อมูล และคุณจะเห็นผลลัพธ์ต่อไปนี้:
เมือง
ตัวกรอง
<ทั้งหมด>
*
เบลวิว
เบลวิว
เคิร์กแลนด์
เคิร์กแลนด์
เรดมอนด์
เรดมอนด์
ซีแอตเทิล
ซีแอตเทิล
Access ทำการรวมเก้าระเบียนที่แสดงก่อนหน้านี้ด้วยค่าเขตข้อมูลคงที่ของ <ทั้งหมด> และ "*"
เนื่องจากส่วนคำสั่งแบบร่วมนี้ไม่มี UNION ALL Access จะส่งกลับระเบียนเฉพาะเท่านั้น ซึ่งหมายความว่าแต่ละเมืองจะถูกส่งกลับเพียงครั้งเดียวด้วยค่าเหมือนกันที่คงที่
-
ขณะนี้คุณมีคิวรีแบบร่วมที่เสร็จสมบูรณ์ซึ่งแสดงชื่อเมืองแต่ละแห่งเพียงหนึ่งครั้ง พร้อมด้วยตัวเลือกที่เลือกเมืองทั้งหมดอย่างมีประสิทธิภาพ คุณสามารถใช้คิวรีนี้เป็นแหล่งระเบียนสำหรับกล่องคำสั่งผสมบนฟอร์ม การใช้ตัวอย่างเฉพาะเหล่านี้เป็นโมเดล คุณสามารถสร้างตัวควบคุมกล่องคำสั่งผสมบนฟอร์ม ตั้งค่าคิวรีนี้เป็นแหล่งระเบียน ตั้งค่าคุณสมบัติความกว้างคอลัมน์ของคอลัมน์ตัวกรองเป็น 0 (ศูนย์) เพื่อซ่อน แล้วตั้งค่าคุณสมบัติคอลัมน์ที่ถูกผูกไว้เป็น 1 เพื่อระบุดัชนีของคอลัมน์ที่สอง ในคุณสมบัติตัวกรองของฟอร์ม คุณสามารถเพิ่มรหัสดังต่อไปนี้เพื่อเปิดใช้งานตัวกรองฟอร์ม โดยใช้ค่าที่ถูกเลือกในตัวควบคุมกล่องคำสั่งผสม:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
ผู้ใช้ของฟอร์มสามารถกรองระเบียนฟอร์มเป็นชื่อเมืองเฉพาะ หรือเลือก <ทั้งหมด> เพื่อแสดงรายการระเบียนทั้งหมดสำหรับทุกเมือง