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

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

คุณสามารถเขียนคิวรีย่อยใน<token>TE000127167</token> หรือในคำสั่ง Structured Query Language (SQL) ใน<token>TE000126761</token>

ในบทความนี้

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm1">การใช้ผลลัพธ์ของคิวรีเป็นเขตข้อมูลในคิวรีอื่น</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm2">การใช้คิวรีย่อยเป็นเกณฑ์สำหรับเขตข้อมูลของคิวรี</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm3">คำสำคัญ SQL ทั่วไปที่คุณสามารถใช้กับคิวรีย่อย</link>

การใช้ผลลัพธ์ของคิวรีเป็นเขตข้อมูลในคิวรีอื่น

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

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

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

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

  1. บนแท็บ <ui>ไฟล์</ui> ให้คลิก <ui>สร้าง</ui>

  2. ภายใต้ <ui>เทมเพลตที่มีอยู่</ui> ให้คลิก <ui>ตัวอย่างเทมเพลต</ui>

  3. คลิก <ui>Northwind</ui> แล้วคลิก <ui>สร้าง</ui>

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

  5. บนแท็บ <ui>สร้าง</ui> ในกลุ่ม <ui>คิวรี</ui> ให้คลิก <ui>ออกแบบคิวรี</ui>

  6. ในกล่องโต้ตอบ <ui>แสดงตาราง</ui> ให้คลิกแท็บ <ui>คิวรี</ui> แล้วดับเบิลคลิก <ui>ใบสั่งซื้อผลิตภัณฑ์</ui>

  7. ปิดกล่องโต้ตอบ <ui>แสดงตาราง</ui>

  8. ดับเบิลคลิกที่เขตข้อมูล <ui>คีย์ผลิตภัณฑ์</ui> และ <ui>วันที่สั่งซื้อ</ui> เพื่อเพิ่มลงในตารางออกแบบคิวรี

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

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

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

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

    Prior Date: (SELECT MAX([Order Date]) 
    FROM [Product Orders] AS [Old Orders]
    WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date]
    AND [Old Orders].[Product ID] = [Product Orders].[Product ID])

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

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

    <codeInline>Interval: [Order Date]-[Prior Date]</codeInline>

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

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

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

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

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

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">ด้านบนของหน้า</link>

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

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

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

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

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

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

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

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

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

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

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

    IN (SELECT [ID] FROM [Employees] 
    WHERE [Job Title]<>'Sales Representative')

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

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

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

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">ด้านบนของหน้า</link>

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

มีคำสำคัญ SQL หลายคำที่คุณสามารถใช้กับคิวรีย่อย ดังนี้

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

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

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

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

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

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

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

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

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

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

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

    SELECT *
    FROM [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

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

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
  • <embeddedLabel>IN</embeddedLabel> ใช้ IN ในส่วนคำสั่ง WHERE เพื่อตรวจสอบว่าค่าในแถวปัจจุบันของคิวรีหลักคือส่วนหนึ่งของชุดที่คิวรีย่อยส่งกลับมา คุณยังสามารถเริ่มต้น IN ด้วย NOT เพื่อตรวจสอบว่าค่าในแถวปัจจุบันของคิวรีหลักไม่ใช่ส่วนหนึ่งของชุดที่คิวรีย่อยส่งกลับมา

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

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]<>'Sales Representative');

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

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">ด้านบนของหน้า</link>

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

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

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

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

×