ในบางครั้ง คุณอาจต้องการรวมระเบียนจากตารางหรือคิวรีหนึ่งกับระเบียนจากตารางอื่นอย่างน้อยหนึ่งตารางให้เป็นผลลัพธ์เดียว นั่นคือสิ่งที่คิวรีแบบร่วมทําใน 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 คําสั่ง
- บนแท็บ สร้าง ในกลุ่ม คิวรี ให้คลิก การออกแบบคิวรี
- บนแท็บ ออกแบบ ในกลุ่ม คิวรี ให้คลิก UNION Access ซ่อนหน้าต่างออกแบบคิวรี และแสดงแท็บวัตถุ มุมมอง 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)
เงื่อนไขในการตรวจสอบ Falseคือ ไม่เคย Trueดังนั้นนิพจน์จะส่งกลับค่า 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
นี่เป็นเคล็ดลับเล็ก ๆ น้อย ๆ เนื่องจากเงื่อนไขเป็น 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 ร่วมนั้นให้มี Product ID = 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 ใน UNIONSQL. สิ่งนี้มักจะส่งผลต่อการเรียงลําดับผลลัพธ์ ดังนั้นคุณอาจต้องการรวมส่วน 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 ทําการรวมเก้าระเบียนที่แสดงก่อนหน้านี้ด้วยค่าเขตข้อมูลคงที่ของ <All> และ "*" เนื่องจากส่วนคําสั่งแบบร่วมนี้ไม่มี
UNION ALLAccess จะส่งกลับระเบียนเฉพาะเท่านั้น ซึ่งหมายความว่าแต่ละเมืองจะถูกส่งกลับเพียงครั้งเดียวด้วยค่าเหมือนกันที่คงที่ในตอนนี้ คุณมีคิวรีแบบร่วมที่เสร็จสมบูรณ์แล้ว ซึ่งแสดงแต่ละชื่อเมืองเพียงครั้งเดียว พร้อมกับตัวเลือกที่เลือกเมืองทั้งหมดได้อย่างมีประสิทธิภาพ คุณสามารถใช้คิวรีนี้เป็นแหล่งระเบียนสําหรับกล่องคําสั่งผสมบนฟอร์มได้ เมื่อใช้ตัวอย่างเฉพาะนี้เป็นตัวแบบ คุณสามารถสร้างตัวควบคุมกล่องคําสั่งผสมบนฟอร์ม ตั้งค่าคิวรีนี้เป็นแหล่งระเบียน ตั้งค่าคุณสมบัติความกว้างคอลัมน์ของคอลัมน์ตัวกรองเป็น 0 (ศูนย์) เพื่อซ่อนแบบมองเห็นได้ จากนั้นตั้งค่าคุณสมบัติคอลัมน์ที่ถูกผูกไว้เป็น 1 เพื่อระบุดัชนีของคอลัมน์ที่สอง ในคุณสมบัติของ
Filterฟอร์มเอง คุณสามารถเพิ่มโค้ดดังต่อไปนี้เพื่อเปิดใช้งานตัวกรองฟอร์มโดยใช้ค่าที่เลือกในตัวควบคุมกล่องคําสั่งผสม:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = Trueผู้ใช้ของฟอร์มสามารถกรองระเบียนฟอร์มเป็นชื่อเมืองเฉพาะ หรือเลือก <ทั้งหมด> เพื่อแสดงรายการระเบียนทั้งหมดสําหรับทุกเมือง