ใช้แบบสอบถามแบบร่วมเพื่อรวมหลายแบบสอบถามลงในผลลัพธ์เดียว

นำไปใช้กับ
Access for Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

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

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

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

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

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

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

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

เมื่อต้องการศึกษาตัวอย่างคิวรีแบบร่วมนี้ต่อ ให้คลิกมุมมอง>หน้าแรก>ของ SQLSQL มุมมอง 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 นี้เป็นคิวรีแบบใช้เลือกข้อมูลสองคิวรีเป็นหลัก คิวรีเหล่านี้จะเรียกใช้ชุดระเบียนที่แตกต่างกันสองชุด จากตารางใบสั่งซื้อผลิตภัณฑ์ และอีกใบสั่งซื้อหนึ่งจากตารางการซื้อผลิตภัณฑ์

ส่วนที่สองของคําสั่งนี้คือSQLUNIONคําสําคัญ ซึ่งจะบอกให้ Access รวมระเบียนสองชุดนี้เข้าด้วยกัน

ส่วนสุดท้ายของคําสั่งนี้จะSQLกําหนดลําดับของระเบียนที่รวมเข้าด้วยกันโดยใช้คําสั่งORDER BY ในตัวอย่างนี้ Access จะเรียงลําดับระเบียนทั้งหมดตามเขตข้อมูล วันที่สั่งซื้อ ตามลําดับจากมากไปหาน้อย

หมายเหตุ

คิวรีแบบร่วมจะเป็นแบบอ่านอย่างเดียวเสมอใน Access คุณไม่สามารถเปลี่ยนค่าใดๆ ในมุมมองแผ่นข้อมูล

สร้างคิวรีแบบร่วมโดยการสร้างและรวมคิวรีแบบใช้เลือกข้อมูล

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

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

  1. บนแท็บ สร้าง ในกลุ่ม คิวรี ให้คลิก ออกแบบคิวรี
  2. ดับเบิลคลิกที่ตารางที่มีเขตข้อมูลที่คุณต้องการรวมไว้ ตารางจะถูกเพิ่มลงในหน้าต่างการออกแบบคิวรี
  3. ในหน้าต่างการออกแบบคิวรี ให้ดับเบิลคลิกที่แต่ละเขตข้อมูลที่คุณต้องการรวมไว้ เมื่อคุณเลือกเขตข้อมูล ให้ตรวจสอบให้แน่ใจว่าคุณเพิ่มเขตข้อมูลจํานวนเท่ากันในลําดับเดียวกัน ที่คุณเพิ่มลงในคิวรีแบบใช้เลือกข้อมูลอื่นๆ ให้ความสนใจกับชนิดข้อมูลของเขตข้อมูล และตรวจสอบให้แน่ใจว่ามีชนิดข้อมูลที่เข้ากันได้กับเขตข้อมูลในตําแหน่งเดียวกันในคิวรีอื่นที่คุณกําลังรวมกันอยู่ ตัวอย่างเช่น ถ้าคิวรีแบบใช้เลือกข้อมูลรายการแรกของคุณมีห้าเขตข้อมูล เขตข้อมูลแรกที่มีข้อมูลวันที่/เวลา ให้ตรวจสอบให้แน่ใจว่าคิวรีแบบใช้เลือกข้อมูลแต่ละคิวรีที่คุณกําลังรวมอยู่มีห้าเขตข้อมูล เขตข้อมูลแรกที่มีข้อมูลวันที่/เวลา และอื่นๆ
  4. อีกทางหนึ่งคือ เพิ่มเกณฑ์ลงในเขตข้อมูลของคุณโดยการพิมพ์นิพจน์ที่เหมาะสมในแถวเกณฑ์ของตารางเขตข้อมูล
  5. หลังจากที่คุณเพิ่มเขตข้อมูลและเกณฑ์เขตข้อมูลเสร็จแล้ว คุณควรเรียกใช้คิวรีแบบใช้เลือกข้อมูลและตรวจทานผลลัพธ์ บนแท็บ ออกแบบ ในกลุ่ม ผลลัพธ์ ให้คลิก เรียกใช้
  6. สลับคิวรีไปยังมุมมองออกแบบ
  7. บันทึกคิวรีแบบใช้เลือกข้อมูล และเปิดทิ้งไว้
  8. ทำซ้ำกระบวนการนี้สำหรับแต่ละคิวรีแบบใช้เลือกข้อมูลที่คุณต้องการรวม

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

  1. บนแท็บ สร้าง ในกลุ่ม คิวรี ให้คลิก การออกแบบคิวรี
  2. บนแท็บ ออกแบบ ในกลุ่ม คิวรี ให้คลิก แบบร่วม Access จะซ่อนหน้าต่างออกแบบคิวรีและแสดงแท็บวัตถุ มุมมอง SQL ณ จุดนี้ แท็บ จะว่างเปล่า
  3. คลิกแท็บสำหรับคิวรีแบบใช้เลือกข้อมูลคิวรีแรกที่คุณต้องการรวมในคิวรีแบบร่วม
  4. บนแท็บ หน้าแรก ให้คลิก ดู>มุมมอง SQL
  5. คัดลอกคําสั่ง SQL สําหรับคิวรีแบบใช้เลือกข้อมูล คลิกแท็บสําหรับคิวรีแบบร่วมที่คุณเริ่มสร้างไว้ก่อนหน้านี้
  6. SQLวางคําสั่งสําหรับคิวรีแบบใช้เลือกข้อมูลลงในแท็บวัตถุมุมมอง SQL ของคิวรีแบบร่วม
  7. ลบเครื่องหมายอัฒภาค (;) ที่ส่วนท้ายของคําสั่งคิวรีแบบใช้เลือกข้อมูลSQL
  8. กด Enter เพื่อย้ายเคอร์เซอร์ลงหนึ่งบรรทัด แล้วพิมพ์ UNION บนบรรทัดใหม่
  9. คลิกแท็บสำหรับคิวรีแบบใช้เลือกข้อมูลคิวรีถัดไปที่คุณต้องการรวมในคิวรีแบบร่วมนี้
  10. ทําซ้ําขั้นตอนที่ 5 ถึง 10 จนกว่าคุณจะได้คัดลอกและวางคําสั่งทั้งหมด SQL สําหรับคิวรีแบบใช้เลือกข้อมูลลงในหน้าต่าง มุมมอง SQL ของคิวรีแบบร่วม อย่าลบเครื่องหมายอัฒภาคหรือพิมพ์อะไรก็ตามที่ตามหลัง SQL คําสั่งสําหรับคิวรีแบบใช้เลือกข้อมูลล่าสุด
  11. บนแท็บ ออกแบบ ในกลุ่ม ผลลัพธ์ ให้คลิก เรียกใช้

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

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

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

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

  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)

เงื่อนไขที่จะตรวจสอบ 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:

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

ซึ่งครอบคลุมพื้นฐานของการเพิ่มผลรวมลงในคิวรีแบบร่วม คุณอาจต้องการรวมค่าคงที่ในทั้งสองคิวรี เช่น "รายละเอียด" และ "ผลรวม" เพื่อแยกระเบียนผลรวมจากระเบียนอื่น คุณสามารถตรวจทานโดยใช้ค่าคงที่ในส่วน รวมตารางหรือคิวรีอย่างน้อยสามรายการในคิวรีแบบร่วม

ทำงานกับระเบียนเฉพาะในคิวรีแบบร่วมโดยใช้ 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

ในคิวรีแบบร่วมที่ระบุไว้ก่อนหน้านี้ คุณจะเห็นว่าเขตข้อมูล ID ใบสั่งซื้อไม่ได้รวมอยู่ด้วย และเขตข้อมูลทั้งสองไม่ได้สร้างระเบียนที่แตกต่างกันสองระเบียน

ถ้าคุณต้องการรวมระเบียนทั้งหมด ให้ใช้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 ALLAccess จึงส่งกลับเฉพาะระเบียนที่แตกต่างเท่านั้น ซึ่งหมายความว่าแต่ละเมืองจะถูกส่งกลับเพียงครั้งเดียวด้วยค่าที่เหมือนกันที่คงที่

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

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

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

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