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

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

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

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

หมายเหตุ: เนื้อหาในบทความนี้มีไว้ใช้กับฐานข้อมูล Access บนเดสก์ท็อป คุณไม่สามารถสร้างหรือใช้คิวรีแบบร่วมในฐานข้อมูล Access บนเว็บ หรือ Access Web App ได้

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

ถ้าคุณไม่เคยสร้างคิวรีแบบร่วมมาก่อน คุณอาจพบว่า ควรศึกษาตัวอย่างการทำงานในเทมเพลต 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. บันทึกคิวรีแบบใช้เลือกข้อมูล และเปิดทิ้งไว้

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

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

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

  2. ปิดกล่องโต้ตอบ แสดงตาราง

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

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

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

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

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

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

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

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

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

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

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

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

ต่อไปนี้คือตัวอย่างที่คุณสามารถสร้างใหม่ในฐานข้อมูลตัวอย่าง 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 การเรียงลำดับจะได้รับอนุญาตเพียงครั้งเดียว แต่สามารถกรองแต่ละคิวรีแยกกันได้ จากคิวรีแบบร่วมของส่วนก่อนหน้า ต่อไปนี้เป็นตัวอย่างของตำแหน่งที่เราได้กรองแต่ละคิวรีโดยเพิ่มส่วนคำสั่ง ตำแหน่ง

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

นี่เป็นเคล็ดลับเล็กๆ น้อยๆ เนื่องจากมักเป็นเท็จเสมอ แล้วคิวรีจะไม่ส่งกลับผลใดๆ รวมคำสั่งนี้กับ 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

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

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

ขยายทักษะ Office ของคุณ
สำรวจการฝึกอบรม
รับฟีเจอร์ใหม่ก่อนใคร
เข้าร่วม Office Insider

ข้อมูลนี้เป็นประโยชน์หรือไม่

ขอบคุณสำหรับคำติชมของคุณ!

ขอขอบคุณสำหรับคำติชมของคุณ! เราคิดว่าอาจเป็นประโยชน์ที่จะให้คุณได้ติดต่อกับหนึ่งในตัวแทนฝ่ายสนับสนุน Office ของเรา

×