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

นำไปใช้กับ
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 เท่านั้น

เมื่อต้องการศึกษาตัวอย่างคิวรีแบบร่วมนี้ต่อไป ให้คลิกมุมมอง หน้าแรก>>มุมมอง 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 ลงในคิวรีแบบร่วม

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

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

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

  1. บนแท็บ สร้าง ในกลุ่ม คิวรี ให้คลิก การออกแบบคิวรี
  2. บนแท็บ ออกแบบ ในกลุ่ม คิวรี ให้คลิก UNION 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

นี่เป็นเคล็ดลับเล็ก ๆ น้อย ๆ เนื่องจากเงื่อนไขเป็น 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

ในคิวรีแบบร่วมที่ระบุไว้ก่อนหน้านี้ คุณสามารถเห็นได้ว่า ไม่มีเขตข้อมูลรหัสใบสั่งผลิตภัณฑ์ และเขตข้อมูลทั้งสองไม่ได้สร้างระเบียนเฉพาะสองระเบียน

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

  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 ทําการรวมเก้าระเบียนที่แสดงก่อนหน้านี้ด้วยค่าเขตข้อมูลคงที่ของ <All> และ "*" เนื่องจากส่วนคําสั่งแบบร่วมนี้ไม่มี UNION ALLAccess จะส่งกลับระเบียนเฉพาะเท่านั้น ซึ่งหมายความว่าแต่ละเมืองจะถูกส่งกลับเพียงครั้งเดียวด้วยค่าเหมือนกันที่คงที่

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

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

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

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