ในบางครั้งคุณอาจต้องการแสดงรายการระเบียนจากตารางหรือคิวรีหนึ่งกับระเบียนจากตารางอื่นอย่างน้อยหนึ่งตารางเพื่อสร้างชุดระเบียน รายการที่มีระเบียนทั้งหมดจากสองตารางหรือมากกว่า นี่คือวัตถุประสงค์ของคิวรีแบบร่วมใน Access
เมื่อต้องการทําความเข้าใจคิวรีแบบร่วมอย่างมีประสิทธิภาพ คุณควรทําความคุ้นเคยกับการออกแบบคิวรีแบบใช้เลือกข้อมูลพื้นฐานใน Access ก่อน เมื่อต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการออกแบบคิวรีแบบใช้เลือกข้อมูล ให้ดู สร้างคิวรีแบบใช้เลือกข้อมูลอย่างง่าย
ศึกษาตัวอย่างคิวรีแบบร่วมที่ทำงานอยู่
ถ้าคุณไม่เคยสร้างคิวรีแบบร่วมมาก่อน คุณอาจพบว่าการศึกษาตัวอย่างการทํางานในเทมเพลต 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
-
บนแท็บ สร้าง ในกลุ่ม คิวรี ให้คลิก ออกแบบคิวรี
-
บนแท็บ ออกแบบ ในกลุ่ม คิวรี ให้คลิก แบบร่วม 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 การสั่งซื้อจะได้รับอนุญาตเพียงครั้งเดียว แต่แต่ละคิวรีสามารถกรองแยกกันได้ สร้างบนคิวรีแบบร่วมของส่วนก่อนหน้า ต่อไปนี้เป็นตัวอย่างของตําแหน่งที่เราได้กรองแต่ละคิวรีโดยการเพิ่มส่วนคําสั่ง 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];
สลับไปยังมุมมองแผ่นข้อมูล และคุณจะเห็นผลลัพธ์ที่คล้ายกับสิ่งนี้:
การจ้างงาน |
นามสกุล |
ชื่อ |
ผู้จำหน่าย |
สุรมงคล |
อรพรรณ |
ภายในองค์กร |
วิลาปนะ |
นันทิดา |
ลูกค้า |
วิจิตรวานิช |
เจตริณ |
ภายในองค์กร |
บุญหลวง |
อัมพร |
ผู้จำหน่าย |
วัฒนา |
อรอนงค์ |
ลูกค้า |
วีรวัตร |
สัญญา |
ผู้จำหน่าย |
ตันตยกุล |
มโน |
ผู้จำหน่าย |
พรพิพัฒนพงศ์ |
กิตติกร |
ภายในองค์กร |
สมวรรณะ |
สุเชาว์ |
ผู้จำหน่าย |
ประภาศิริรัตน์ |
บุษบา |
ภายในองค์กร |
ธรรมานนท์ |
ไชยยนต์ |
ถ้าคิวรีที่จะรวมแตกต่างกันมาก คุณอาจพบสถานการณ์ที่เขตข้อมูลผลลัพธ์ต้องรวมข้อมูลของชนิดข้อมูลที่แตกต่างกัน ถ้าเป็นเช่นนั้น คิวรีแบบร่วมมักจะส่งกลับผลลัพธ์เป็นชนิดข้อมูลข้อความ เนื่องจากชนิดข้อมูลนั้นสามารถเก็บได้ทั้งข้อความ และ ตัวเลข
เมื่อต้องการทําความเข้าใจวิธีการทํางานนี้ เราจะใช้คิวรีแบบร่วม ธุรกรรมผลิตภัณฑ์ ในฐานข้อมูลตัวอย่าง 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:
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
ซึ่งครอบคลุมพื้นฐานของการเพิ่มผลรวมลงในคิวรีแบบร่วม คุณอาจต้องการรวมค่าคงที่ในทั้งสองคิวรี เช่น "รายละเอียด" และ "ผลรวม" เพื่อแยกระเบียนผลรวมจากระเบียนอื่น คุณสามารถตรวจทานโดยใช้ค่าคงที่ในส่วน รวมตารางหรือคิวรีอย่างน้อยสามรายการในคิวรีแบบร่วม
คิวรีแบบร่วมใน 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
ผู้ใช้ของฟอร์มสามารถกรองระเบียนฟอร์มเป็นชื่อเมืองเฉพาะ หรือเลือก <ทั้งหมด> เพื่อแสดงรายการระเบียนทั้งหมดสำหรับทุกเมือง