ใช้คิวรีแบบร่วมเพื่อรวมหลายคิวรีลงในผลลัพธ์เดียว
Applies ToAccess for Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

ในบางครั้งคุณอาจต้องการแสดงรายการระเบียนจากตารางหรือคิวรีหนึ่งกับระเบียนจากตารางอื่นอย่างน้อยหนึ่งตารางเพื่อสร้างชุดระเบียน รายการที่มีระเบียนทั้งหมดจากสองตารางหรือมากกว่า นี่คือวัตถุประสงค์ของคิวรีแบบร่วมใน Access

เมื่อต้องการทําความเข้าใจคิวรีแบบร่วมอย่างมีประสิทธิภาพ คุณควรทําความคุ้นเคยกับการออกแบบคิวรีแบบใช้เลือกข้อมูลพื้นฐานใน Access ก่อน เมื่อต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการออกแบบคิวรีแบบใช้เลือกข้อมูล ให้ดู สร้างคิวรีแบบใช้เลือกข้อมูลอย่างง่าย

ศึกษาตัวอย่างคิวรีแบบร่วมที่ทำงานอยู่

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

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

สามารถแยกความแตกต่างคิวรีแบบร่วมจากวัตถุคิวรีอื่นๆ ได้อย่างง่ายดายเนื่องจากมีไอคอนพิเศษที่คล้ายคลึงกับวงกลมที่พันกันสองวง ซึ่งแสดงถึงชุดรวมกันจากสองชุด:

สกรีนช็อตของไอคอนคิวรีแบบรวมใน Access

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

เมื่อต้องการศึกษาตัวอย่างคิวรีแบบร่วมนี้ต่อ ให้คลิก มุมมอง > หน้าแรก>มุมมอง SQL เพื่อดูไวยากรณ์ SQL ที่กําหนด ในภาพประกอบนี้ เราได้เพิ่มระยะห่างเพิ่มเติมใน SQL เพื่อให้คุณสามารถดูส่วนต่างๆ ที่สร้างคิวรีแบบร่วมได้อย่างง่ายดาย

เบราว์เซอร์ของคุณไม่สนับสนุนวิดีโอ ติดตั้ง Microsoft Silverlight, Adobe Flash Player หรือ Internet Explorer 9

ลองศึกษาไวยากรณ์ 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 ลงในคิวรีแบบร่วมที่รวมเข้าด้วยกันได้

ถ้าคุณต้องการข้ามการอ่านขั้นตอน และดูตัวอย่างแทน ให้ดูส่วนถัดไป ดูตัวอย่างของการสร้างคิวรีแบบร่วม

  1. บนแท็บ สร้าง ในกลุ่ม คิวรี ให้คลิก ออกแบบคิวรี

  2. ดับเบิลคลิกที่ตารางที่มีเขตข้อมูลที่คุณต้องการรวมไว้ ตารางจะถูกเพิ่มลงในหน้าต่างการออกแบบคิวรี

  3. ในหน้าต่างการออกแบบคิวรี ให้ดับเบิลคลิกที่แต่ละเขตข้อมูลที่คุณต้องการรวมไว้ เมื่อคุณเลือกเขตข้อมูล ให้ตรวจสอบให้แน่ใจว่าคุณเพิ่มเขตข้อมูลจํานวนเท่ากันในลําดับเดียวกัน ที่คุณเพิ่มลงในคิวรีแบบใช้เลือกข้อมูลอื่นๆ ให้ความสนใจกับชนิดข้อมูลของเขตข้อมูล และตรวจสอบให้แน่ใจว่ามีชนิดข้อมูลที่เข้ากันได้กับเขตข้อมูลในตําแหน่งเดียวกันในคิวรีอื่นที่คุณกําลังรวมกันอยู่ ตัวอย่างเช่น ถ้าคิวรีแบบใช้เลือกข้อมูลรายการแรกของคุณมีห้าเขตข้อมูล เขตข้อมูลแรกที่มีข้อมูลวันที่/เวลา ให้ตรวจสอบให้แน่ใจว่าคิวรีแบบใช้เลือกข้อมูลแต่ละคิวรีที่คุณกําลังรวมอยู่มีห้าเขตข้อมูล เขตข้อมูลแรกที่มีข้อมูลวันที่/เวลา และอื่นๆ

  4. อีกทางหนึ่งคือ เพิ่มเกณฑ์ลงในเขตข้อมูลของคุณโดยการพิมพ์นิพจน์ที่เหมาะสมในแถวเกณฑ์ของตารางเขตข้อมูล

  5. หลังจากที่คุณเพิ่มเขตข้อมูลและเกณฑ์เขตข้อมูลเสร็จแล้ว คุณควรเรียกใช้คิวรีแบบใช้เลือกข้อมูลและตรวจทานผลลัพธ์ บนแท็บ ออกแบบ ในกลุ่ม ผลลัพธ์ ให้คลิก เรียกใช้

  6. สลับคิวรีไปยังมุมมองออกแบบ

  7. บันทึกคิวรีแบบใช้เลือกข้อมูล และเปิดทิ้งไว้

  8. ทำซ้ำกระบวนการนี้สำหรับแต่ละคิวรีแบบใช้เลือกข้อมูลที่คุณต้องการรวม

หลังจากที่คุณสร้างคิวรีแบบใช้เลือกข้อมูลแล้ว ก็ถึงเวลารวมคิวรีเหล่านั้น ในขั้นตอนนี้ คุณสร้างคิวรีแบบร่วมโดยการคัดลอกและวางคําสั่ง SQL

  1. บนแท็บ สร้าง ในกลุ่ม คิวรี ให้คลิก ออกแบบคิวรี

  2. บนแท็บ ออกแบบ ในกลุ่ม คิวรี ให้คลิก แบบร่วม Access จะซ่อนหน้าต่างออกแบบคิวรี และแสดงแท็บวัตถุมุมมอง SQL ณ จุดนี้ แท็บวัตถุมุมมอง SQL ว่างเปล่า

  3. คลิกแท็บสำหรับคิวรีแบบใช้เลือกข้อมูลคิวรีแรกที่คุณต้องการรวมในคิวรีแบบร่วม

  4. บนแท็บ หน้าแรก ให้คลิก มุมมอง > มุมมอง SQL

  5. คัดลอกคําสั่ง SQL สําหรับคิวรีแบบใช้เลือกข้อมูล คลิกแท็บสําหรับคิวรีแบบร่วมที่คุณเริ่มสร้างไว้ก่อนหน้านี้

  6. วางคำสั่ง SQL สำหรับคิวรีแบบใช้เลือกข้อมูลในแท็บวัตถุมุมมอง SQL ของคิวรีแบบร่วม

  7. ลบเครื่องหมายอัฒภาค (;) ที่ท้ายคำสั่ง SQL สำหรับคิวรีแบบใช้เลือกข้อมูล

  8. กด Enter เพื่อย้ายเคอร์เซอร์ลงไปหนึ่งบรรทัด แล้วพิมพ์ UNION บนบรรทัดใหม่

  9. คลิกแท็บสำหรับคิวรีแบบใช้เลือกข้อมูลคิวรีถัดไปที่คุณต้องการรวมในคิวรีแบบร่วมนี้

  10. ทําซ้ําขั้นตอนที่ 5 ถึง 10 จนกว่าคุณจะคัดลอกและวางคําสั่ง SQL ทั้งหมดสําหรับคิวรีแบบใช้เลือกข้อมูลลงในหน้าต่างมุมมอง SQL ของคิวรีแบบร่วม อย่าลบเครื่องหมายอัฒภาคหรือพิมพ์อะไรต่อจากคําสั่ง SQL สําหรับคิวรีแบบใช้เลือกข้อมูลล่าสุด

  11. บนแท็บ ออกแบบ ในกลุ่ม ผลลัพธ์ ให้คลิก เรียกใช้

ผลลัพธ์ของคิวรีแบบร่วมของคุณจะปรากฏขึ้นในมุมมองแผ่นข้อมูล

ดูตัวอย่างของการสร้างคิวรีแบบร่วม

ต่อไปนี้เป็นตัวอย่างที่คุณสามารถสร้างใหม่ในฐานข้อมูลตัวอย่าง Northwind คิวรีแบบร่วมนี้จะรวบรวมชื่อของบุคคลจากตารางลูกค้าและรวมชื่อเหล่านั้นเข้ากับชื่อของบุคคลจากตารางผู้จําหน่าย ถ้าคุณต้องการปฏิบัติตาม ให้ทําตามขั้นตอนเหล่านี้ในสําเนาฐานข้อมูลตัวอย่าง Northwind ของคุณ

เบราว์เซอร์ของคุณไม่สนับสนุนวิดีโอ ติดตั้ง Microsoft Silverlight, Adobe Flash Player หรือ Internet Explorer 9

ต่อไปนี้คือขั้นตอนที่จำเป็นในการสร้างตัวอย่างนี้:

  1. สร้างคิวรีแบบใช้เลือกข้อมูลสองคิวรีที่เรียกว่า Query1 และ Query2 ด้วยตารางลูกค้าและผู้จําหน่ายเป็นแหล่งข้อมูลตามลําดับ ใช้เขตข้อมูลชื่อและนามสกุลเป็นค่าที่แสดง

  2. สร้างคิวรีใหม่ที่เรียกว่า Query3 โดยไม่มีแหล่งข้อมูลตั้งแต่เริ่มต้น แล้วคลิกคำสั่ง UNION บนแท็บ ออกแบบ เพื่อใส่คิวรีนี้ลงในคิวรีแบบร่วม

  3. คัดลอกและวางคําสั่ง SQL จาก Query1 และ Query2 ลงใน Query3 ตรวจสอบให้แน่ใจว่าได้เอาเครื่องหมายอัฒภาคพิเศษออกและเพิ่มในคําสําคัญ UNION จากนั้นคุณสามารถตรวจสอบผลลัพธ์ของคุณในมุมมองแผ่นข้อมูลได้

  4. เพิ่มในส่วนคําสั่งการเรียงลําดับลงในคิวรีใดคิวรีหนึ่ง แล้ววางคําสั่ง ORDER BY ลงในมุมมอง SQL ของคิวรีแบบร่วม โปรดสังเกตว่า ใน Query3 คิวรีแบบร่วม เมื่อลําดับกําลังจะผนวก เครื่องหมายอัฒภาคจะถูกเอาออกก่อน จากนั้นชื่อตารางจากชื่อเขตข้อมูล

  5. 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 เพื่อแสดงวิธีการหาผลรวมในคิวรีแบบร่วม

  1. สร้างคิวรีแบบง่ายใหม่เพื่อดูการซื้อเบียร์ (รหัสผลิตภัณฑ์=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];
  2. สลับไปยังมุมมองแผ่นข้อมูล และคุณจะเห็นการซื้อสี่รายการ:

    วันที่ได้รับ

    จำนวน

    22/1/2006

    100

    22/1/2006

    60

    4/4/2006

    50

    5/4/2006

    300

  3. เมื่อต้องการดูผลรวม ให้สร้างคิวรีการรวมอย่างง่ายโดยใช้ SQL ต่อไปนี้:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
  4. สลับไปยังมุมมองแผ่นข้อมูล และคุณจะเห็นเพียงระเบียนเดียว:

    วันที่สูงสุดที่ได้รับ

    ยอดรวมจำนวน

    5/4/2006

    510

  5. รวมสองคิวรีนี้ลงในคิวรีแบบร่วมเพื่อผนวกระเบียนด้วยจำนวนรวมกับระเบียนการซื้อ:

    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. สลับไปยังมุมมองแผ่นข้อมูล และคุณจะเห็นการซื้อสี่รายการที่มีผลรวมของแต่ละรายการตามด้วยระเบียนที่มีจำนวนรวม:

    วันที่ได้รับ

    จำนวน

    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 เพื่อแสดงสถานการณ์นี้

  1. สร้างคิวรีแบบใช้เลือกข้อมูลอย่างง่ายโดยใช้ไวยากรณ์ SQL นี้:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. สลับมุมมองแผ่นข้อมูล และคุณจะเห็นผลลัพธ์ต่อไปนี้:

    เมือง

    ตัวกรอง

    ซีแอตเทิล

    ซีแอตเทิล

    เบลวิว

    เบลวิว

    เรดมอนด์

    เรดมอนด์

    เคิร์กแลนด์

    เคิร์กแลนด์

    ซีแอตเทิล

    ซีแอตเทิล

    เรดมอนด์

    เรดมอนด์

    ซีแอตเทิล

    ซีแอตเทิล

    เรดมอนด์

    เรดมอนด์

    ซีแอตเทิล

    ซีแอตเทิล

  3. เมื่อดูผลลัพธ์เหล่านั้น คุณอาจไม่เห็นค่าจํานวนมาก ขยายคิวรีและแปลงคิวรีเป็นคิวรีแบบร่วมโดยใช้ SQL ต่อไปนี้:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. สลับมุมมองแผ่นข้อมูล และคุณจะเห็นผลลัพธ์ต่อไปนี้:

    เมือง

    ตัวกรอง

    <ทั้งหมด>

    *

    เบลวิว

    เบลวิว

    เคิร์กแลนด์

    เคิร์กแลนด์

    เรดมอนด์

    เรดมอนด์

    ซีแอตเทิล

    ซีแอตเทิล

    Access ทำการรวมเก้าระเบียนที่แสดงก่อนหน้านี้ด้วยค่าเขตข้อมูลคงที่ของ <ทั้งหมด> และ "*"

    เนื่องจากส่วนคำสั่งแบบร่วมนี้ไม่มี UNION ALL Access จะส่งกลับระเบียนเฉพาะเท่านั้น ซึ่งหมายความว่าแต่ละเมืองจะถูกส่งกลับเพียงครั้งเดียวด้วยค่าเหมือนกันที่คงที่

  5. ในตอนนี้ คุณมีคิวรีแบบร่วมที่สมบูรณ์ซึ่งแสดงชื่อเมืองแต่ละชื่อเพียงครั้งเดียว พร้อมกับตัวเลือกที่เลือกเมืองทั้งหมดอย่างมีประสิทธิภาพ คุณสามารถใช้คิวรีนี้เป็นแหล่งระเบียนสําหรับกล่องคําสั่งผสมบนฟอร์ม เมื่อใช้ตัวอย่างที่ระบุนี้เป็นตัวแบบข้อมูล คุณสามารถสร้างตัวควบคุมกล่องคําสั่งผสมบนฟอร์ม ตั้งค่าคิวรีนี้เป็นแหล่งระเบียน ตั้งค่าคุณสมบัติ ความกว้างคอลัมน์ ของคอลัมน์ ตัวกรอง เป็น 0 (ศูนย์) เพื่อซ่อนให้มองเห็นได้ จากนั้นตั้งค่าคุณสมบัติ คอลัมน์ที่ถูกผูกไว้ เป็น 1 เพื่อระบุดัชนีของคอลัมน์ที่สอง ในคุณสมบัติ ตัวกรอง ของฟอร์ม คุณสามารถเพิ่มโค้ดดังต่อไปนี้เพื่อเปิดใช้งานตัวกรองฟอร์มโดยใช้ค่าของสิ่งที่ถูกเลือกในตัวควบคุมกล่องคําสั่งผสม:

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

    ผู้ใช้ของฟอร์มสามารถกรองระเบียนฟอร์มเป็นชื่อเมืองเฉพาะ หรือเลือก <ทั้งหมด> เพื่อแสดงรายการระเบียนทั้งหมดสำหรับทุกเมือง

ด้านบนของหน้า

ต้องการความช่วยเหลือเพิ่มเติมหรือไม่

ต้องการตัวเลือกเพิ่มเติมหรือไม่

สํารวจสิทธิประโยชน์ของการสมัครใช้งาน เรียกดูหลักสูตรการฝึกอบรม เรียนรู้วิธีการรักษาความปลอดภัยอุปกรณ์ของคุณ และอื่นๆ

ชุมชนช่วยให้คุณถามและตอบคําถาม ให้คําติชม และรับฟังจากผู้เชี่ยวชาญที่มีความรู้มากมาย