การซ้อนแบบสอบถามภายในแบบสอบถามอื่นหรือในนิพจน์โดยใช้แบบสอบถามย่อย

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

คุณสามารถเขียนแบบสอบถามย่อยในนิพจน์ หรือในคำสั่ง Structured Query Language (SQL) ในมุมมอง SQL

ในบทความนี้

การใช้ผลลัพธ์ของแบบสอบถามเป็นเขตข้อมูลในแบบสอบถามอื่น

การใช้แบบสอบถามย่อยเป็นเกณฑ์สำหรับเขตข้อมูลของแบบสอบถาม

คำสำคัญ SQL ทั่วไปที่คุณสามารถใช้กับแบบสอบถามย่อย

การใช้ผลลัพธ์ของแบบสอบถามเป็นเขตข้อมูลในแบบสอบถามอื่น

คุณสามารถใช้แบบสอบถามย่อยเป็นalias (SQL)ของเขตข้อมูลได้ ให้ใช้แบบสอบถามย่อยเป็นนามแฝงของเขตข้อมูลเมื่อคุณต้องการใช้ผลลัพธ์แบบสอบถามย่อยเป็นเขตข้อมูลในแบบสอบถามหลักของคุณ

หมายเหตุ: แบบสอบถามย่อยที่คุณใช้เป็นนามแฝงของเขตข้อมูลไม่สามารถแสดงมากกว่าหนึ่งเขตข้อมูล

คุณสามารถใช้นามแฝงเขตข้อมูลของแบบสอบถามย่อยเพื่อแสดงค่าที่ขึ้นอยู่กับค่าอื่นในแถวปัจจุบัน ซึ่งจะไม่สามารถแสดงค่าได้ถ้าไม่ใช่แบบสอบถามย่อย

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

แสดงวิธีตั้งค่า Northwind

  1. บนแท็บ แฟ้ม ให้คลิก สร้าง

  2. ภายใต้ แม่แบบที่มีอยู่ คลิก แม่แบบตัวอย่าง

  3. คลิก Northwind แล้วคลิก สร้าง

  4. ทำตามคำแนะนำบนหน้า Northwind Traders (บนแท็บวัตถุ Startup Screen) เพื่อเปิดฐานข้อมูล จากนั้นปิดหน้าต่างของกล่องโต้ตอบ เข้าสู่ระบบ

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

  2. ในกล่องโต้ตอบ แสดงตาราง ให้คลิกแท็บ แบบสอบถาม แล้วคลิกสองครั้งที่ ใบสั่งซื้อผลิตภัณฑ์

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

  4. คลิกสองครั้งที่เขตข้อมูล รหัสผลิตภัณฑ์ และ วันที่สั่งซื้อ เพื่อเพิ่มไปยังตารางออกแบบแบบสอบถาม

  5. ในแถว เรียงลำดับ ของคอลัมน์ รหัสผลิตภัณฑ์ ในตาราง ให้เลือก จากน้อยไปหามาก

  6. ในแถว เรียงลำดับ ของคอลัมน์ วันที่สั่งซื้อ ในตาราง ให้เลือก จากมากไปหาน้อย

  7. ในคอลัมน์ที่สามของตาราง ให้คลิกขวาที่แถว เขตข้อมูล จากนั้นคลิก ย่อ/ขยาย บนเมนูทางลัด

  8. ในกล่องโต้ตอบ ย่อ/ขยาย ให้พิมพ์หรือวางนิพจน์ต่อไปนี้

    วันที่ก่อนหน้า: (SELECT MAX([วันที่สั่งซื้อ]) 
    FROM [ใบสั่งซื้อผลิตภัณฑ์] AS [ใบสั่งซื้อเก่า]
    WHERE [ใบสั่งซื้อเก่า].[วันที่สั่งซื้อ] < [ใบสั่งซื้อผลิตภัณฑ์].[วันที่สั่งซื้อ]
    AND [ใบสั่งซื้อเก่า].[รหัสผลิตภัณฑ์] = [ใบสั่งซื้อผลิตภัณฑ์].[รหัสผลิตภัณฑ์])

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

  1. ในคอลัมน์ที่สี่ของตาราง ในแถว เขตข้อมูล ให้พิมพ์นิพจน์ต่อไปนี้

    ช่วง: [วันที่สั่งซื้อ]-[วันที่ก่อนหน้า]

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

  1. บนแท็บ ออกแบบ ในกลุ่ม เครื่องมือ ให้คลิก เรียกใช้

    1. แบบสอบถามจะทำงานและแสดงรายชื่อผลิตภัณฑ์ วันที่สั่งซื้อ วันที่สั่งซื้อก่อนหน้า และช่วงเวลาระหว่างวันที่สั่งซื้อ ผลลัพธ์จะถูกจัดเรียงโดยเริ่มจากรหัสผลิตภัณฑ์ (ตามลำดับจากน้อยไปหามาก) และตามด้วยวันที่สั่งซื้อ (ตามลำดับมากไปหาน้อย)

    2. หมายเหตุ: เนื่องจากรหัสผลิตภัณฑ์เป็นเขตข้อมูลการค้นหา ตามค่าเริ่มต้น Access จะแสดงค่าการค้นหา (ในกรณีนี้คือรหัสผลิตภัณฑ์) ไม่ใช่รหัสผลิตภัณฑ์จริง แม้ว่าการกระทำดังกล่าวจะเป็นการเปลี่ยนแปลงค่าที่ปรากฏ แต่จะไม่เปลี่ยนแปลงลำดับการจัดเรียง

  2. ปิดฐานข้อมูล Northwind

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

การใช้แบบสอบถามย่อยเป็นเกณฑ์สำหรับเขตข้อมูลของแบบสอบถาม

คุณสามารถใช้แบบสอบถามย่อยเป็นเกณฑ์ของเขตข้อมูลได้ ให้ใช้แบบสอบถามย่อยเป็นเกณฑ์ของเขตข้อมูล เมื่อคุณใช้ผลลัพธ์ของแบบสอบถามย่อยเพื่อจำกัดค่าที่เขตข้อมูลแสดง

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

  1. เปิด Northwind 2007.accdb และเปิดใช้เนื้อหา

  2. ปิดฟอร์มการเข้าสู่ระบบ

  3. บนแท็บ สร้าง ในกลุ่ม อื่นๆ แล้วคลิก ออกแบบแบบสอบถาม

  4. ในกล่องโต้ตอบ แสดงตาราง บนแท็บ ตาราง ให้คลิกสองครั้งที่ ใบสั่งซื้อ และ พนักงาน

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

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

  7. คลิกขวาที่แถว เกณฑ์ ของคอลัมน์ รหัสพนักงาน จากนั้นคลิก ย่อ/ขยาย บนเมนูทางลัด

  8. ในกล่อง ย่อ/ขยาย ให้พิมพ์หรือวางนิพจน์ต่อไปนี้

    IN (SELECT [รหัส] FROM [พนักงาน] 
    WHERE [ตำแหน่งงาน]<>'พนักงานขาย')

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

  9. บนแท็บ ออกแบบ ในกลุ่ม เครื่องมือ ให้คลิก เรียกใช้

    แบบสอบถามจะทำงาน และผลลัพธ์ของแบบสอบถามจะแสดงรายการของการสั่งซื้อที่ประมวลผลโดยพนักงานที่ไม่ใช่พนักงานขาย

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

คำสำคัญ SQL ทั่วไปที่คุณสามารถใช้กับแบบสอบถามย่อย

มีคำสำคัญ SQL หลายคำที่คุณสามารถใช้กับแบบสอบถามย่อย:

หมายเหตุ: รายการนี้ไม่ใช่รายการที่ละเอียดครบถ้วนทุกกรณี คุณสามารถใช้คำสำคัญ SQL ใดๆ ในแบบสอบถามย่อย แต่ไม่รวมคำสำคัญคำจำกัดความข้อมูล

  • ALL    ใช้ ALL ในส่วนคำสั่ง WHERE เพื่อเรียกข้อมูลแถวที่ตรงตามเงื่อนไข เมื่อเปรียบเทียบกับแถวทั้งหมดที่แสดงผลจากแบบสอบถามย่อย

ตัวอย่างเช่น สมมติว่าคุณกำลังวิเคราะห์ข้อมูลนักศึกษาในวิทยาลัย นักศึกษาจะต้องมีผลการเรียนไม่ต่ำกว่า GPA ต่ำสุด ซึ่งแตกต่างกันออกไปตามวิชาเอก ข้อมูลวิชาเอก และ GPA ของนักศึกษาถูกจัดเก็บไว้ในตารางชื่อ วิชาเอก และข้อมูลอื่นๆ ที่เกี่ยวข้องของนักศึกษาถูกจัดเก็บไว้ในตารางชื่อ ระเบียนนักศึกษา

เมื่อต้องการดูรายการของวิชาเอก (และ GPA ต่ำสุด) ซึ่งนักเรียนทุกคนในวิชาเอกนั้นได้คะแนนเกิน GPA ต่ำสุด คุณสามารถใช้แบบสอบถามต่อไปนี้

SELECT [วิชาเอก], [GPA ต่ำสุด] 
FROM [วิชาเอก]
WHERE [GPA ต่ำสุด] < ALL
(SELECT [GPA] FROM [ระเบียนนักศึกษา]
WHERE [ระเบียนนักศึกษา].[วิชาเอก]=[วิชาเอก].[วิชาเอก]);
  • ANY    ใช้ ANY ในส่วนคำสั่ง WHERE เพื่อเรียกข้อมูลแถวที่ตรงตามเงื่อนไข เมื่อเปรียบเทียบกับแถวที่แสดงผลจากแบบสอบถามย่อยอย่างน้อยหนึ่งแถว

    ตัวอย่างเช่น สมมติว่าคุณกำลังวิเคราะห์ข้อมูลนักศึกษาในวิทยาลัย นักศึกษาจะต้องมีผลการเรียนไม่ต่ำกว่า GPA ต่ำสุด ซึ่งแตกต่างกันออกไปตามวิชาเอก ข้อมูลวิชาเอก และ GPA ของนักศึกษาถูกจัดเก็บไว้ในตารางชื่อ วิชาเอก และข้อมูลอื่นๆ ที่เกี่ยวข้องของนักศึกษาถูกจัดเก็บไว้ในตารางชื่อ ระเบียนนักศึกษา

    เมื่อต้องการดูรายการของวิชาเอก (และ GPA ต่ำสุด) ซึ่งนักเรียนในวิชาเอกนั้นได้คะแนนไม่ถึง GPA ต่ำสุด คุณสามารถใช้แบบสอบถามต่อไปนี้

    SELECT [วิชาเอก], [GPA ต่ำสุด] 
    FROM [วิชาเอก]
    WHERE [GPA ต่ำสุด] > ANY
    (SELECT [GPA] FROM [ระเบียนนักศึกษา]
    WHERE [ระเบียนนักศึกษา].[วิชาเอก]=[วิชาเอก].[วิชาเอก]);

    หมายเหตุ: นอกจากนี้ คุณยังสามารถใช้คำสำคัญ SOME เพื่อวัตถุประสงค์เดียวกัน คำสำคัญ SOME เป็นคำที่มีความหมายเหมือนกับ ANY

  • EXISTS    ใช้ EXISTS ในส่วนคำสั่ง WHERE เพื่อระบุว่าแบบสอบถามย่อยควรส่งกลับค่าอย่างน้อยหนึ่งแถว คุณยังสามารถเริ่มต้น EXISTS ด้วย NOT เพื่อระบุว่าแบบสอบถามย่อยไม่ควรส่งกลับแถวใดๆ

    ตัวอย่างเช่น แบบสอบถามต่อไปนี้แสดงรายการผลิตภัณฑ์ที่พบในการสั่งซื้ออย่างน้อยหนึ่งรายการที่มีอยู่:

    SELECT *
    FROM [ผลิตภัณฑ์]
    WHERE EXISTS
    (SELECT * FROM [รายละเอียดใบสั่งซื้อ]
    WHERE [รายละเอียดใบสั่งซื้อ].[รหัสผลิตภัณฑ์]=[ผลิตภัณฑ์].[รหัส]);

    เมื่อใช้ NOT EXISTS แบบสอบถามจะแสดงรายการผลิตภัณฑ์ที่ไม่พบในการสั่งซื้ออย่างน้อยหนึ่งรายการที่มีอยู่:

    SELECT *
    FROM [ผลิตภัณฑ์]
    WHERE NOT EXISTS
    (SELECT * FROM [รายละเอียดใบสั่งซื้อ]
    WHERE [รายละเอียดใบสั่งซื้อ].[รหัสผลิตภัณฑ์]=[ผลิตภัณฑ์].[รหัส]);
  • IN    ใช้ IN ในส่วนคำสั่ง WHERE เพื่อตรวจสอบว่าค่าในแถวปัจจุบันของแบบสอบถามหลักคือส่วนหนึ่งของชุดที่แบบสอบถามย่อยส่งกลับมา คุณยังสามารถเริ่มต้น IN ด้วย NOT เพื่อตรวจสอบว่าค่าในแถวปัจจุบันของแบบสอบถามหลักไม่ใช่ส่วนหนึ่งของชุดที่แบบสอบถามย่อยส่งกลับมา

    ตัวอย่างเช่น แบบสอบถามต่อไปนี้จะแสดงรายการของการสั่งซื้อ (ที่มีวันที่สั่งซื้อ) ที่ประมวลผลโดยพนักงานที่ไม่ใช่พนักงานขาย:

    SELECT [รหัสใบสั่งซื้อ], [วันที่สั่งซื้อ]
    FROM [ใบสั่งซื้อ]
    WHERE [รหัสพนักงาน] IN
    (SELECT [รหัส] FROM [พนักงาน]
    WHERE [ตำแหน่งงาน]<>'พนักงานขาย');

    เมื่อใช้ NOT IN คุณสามารถเขียนแบบสอบถามเดียวกันดังนี้:

    SELECT [รหัสใบสั่งซื้อ], [วันที่สั่งซื้อ]
    FROM [ใบสั่งซื้อ]
    WHERE [รหัสพนักงาน] NOT IN
    (SELECT [รหัส] FROM [พนักงาน]
    WHERE [ตำแหน่งงาน]='พนักงานขาย');

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

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

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

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

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

×