บางครั้งคุณอาจต้องการใช้ผลลัพธ์ของคิวรีเป็นเขตข้อมูลในคิวรีอื่น หรือเป็นเกณฑ์สําหรับเขตข้อมูลคิวรี ตัวอย่างเช่น สมมติว่าคุณต้องการดูช่วงเวลาระหว่างคําสั่งซื้อสําหรับแต่ละผลิตภัณฑ์ของคุณ เมื่อต้องการสร้างคิวรีที่แสดงช่วงเวลานี้ คุณจําเป็นต้องเปรียบเทียบวันที่ในใบสั่งแต่ละวันที่กับวันที่สั่งซื้ออื่นๆ สําหรับผลิตภัณฑ์นั้น การเปรียบเทียบวันที่สั่งซื้อเหล่านี้จําเป็นต้องมีคิวรีด้วย คุณสามารถซ้อนคิวรีนี้ภายในคิวรีหลักของคุณโดยใช้ คิวรีย่อย
คุณสามารถเขียนคิวรีย่อยใน นิพจน์ หรือในคําสั่ง Structured Query Language (SQL) ใน มุมมอง SQL
ในบทความนี้
ใช้ผลลัพธ์ของคิวรีเป็นเขตข้อมูลในคิวรีอื่น
คุณสามารถใช้คิวรีย่อยเป็นนามแฝงของเขตข้อมูลได้ ใช้คิวรีย่อยเป็นนามแฝงของเขตข้อมูลเมื่อคุณต้องการใช้ผลลัพธ์คิวรีย่อยเป็นเขตข้อมูลในคิวรีหลักของคุณ
หมายเหตุ: คิวรีย่อยที่คุณใช้เป็นนามแฝงของเขตข้อมูลไม่สามารถส่งกลับเขตข้อมูลได้มากกว่าหนึ่งเขตข้อมูล
คุณสามารถใช้นามแฝงของเขตข้อมูลคิวรีย่อยเพื่อแสดงค่าที่ขึ้นอยู่กับค่าอื่นๆ ในแถวปัจจุบัน ซึ่งไม่สามารถทําได้โดยไม่ต้องใช้คิวรีย่อย
ตัวอย่างเช่น ให้เรากลับไปที่ตัวอย่างที่คุณต้องการดูช่วงเวลาระหว่างคําสั่งซื้อสําหรับผลิตภัณฑ์แต่ละรายการของคุณ เมื่อต้องการกําหนดช่วงเวลานี้ คุณจําเป็นต้องเปรียบเทียบวันที่สั่งซื้อแต่ละรายการกับวันที่สั่งซื้ออื่นๆ สําหรับผลิตภัณฑ์นั้น คุณสามารถสร้างคิวรีที่แสดงข้อมูลนี้โดยใช้เทมเพลตฐานข้อมูล Northwind
-
บนแท็บ ไฟล์ ให้คลิก ใหม่
-
ภายใต้ เทมเพลตที่พร้อมใช้งาน ให้คลิก เทมเพลตตัวอย่าง
-
คลิก Northwind แล้วคลิก สร้าง
-
ทำตามคำแนะนำบนหน้า Northwind Traders (บนแท็บวัตถุ หน้าจอเริ่มต้น) เพื่อเปิดฐานข้อมูลนี้ จากนั้นปิดหน้าต่างของกล่องโต้ตอบการเข้าสู่ระบบ
-
บนแท็บ สร้าง ในกลุ่ม คิวรี ให้คลิก การออกแบบคิวรี
-
คลิกแท็บ คิวรี แล้วดับเบิลคลิกคําสั่งซื้อผลิตภัณฑ์
-
ดับเบิลคลิกที่เขตข้อมูล รหัสผลิตภัณฑ์ และเขตข้อมูล วันที่สั่งซื้อ เพื่อเพิ่มเขตข้อมูลเหล่านั้นลงในตารางออกแบบคิวรี
-
ในแถว เรียงลําดับ ของคอลัมน์ รหัสผลิตภัณฑ์ ของเส้นตาราง ให้เลือก จากน้อยไปหามาก
-
ในแถว เรียงลําดับ ของคอลัมน์ วันที่สั่งซื้อ ของเส้นตาราง ให้เลือก จากมากไปหาน้อย
-
ในคอลัมน์ที่สามของเส้นตาราง ให้คลิกขวาที่แถว เขตข้อมูล แล้วคลิก ย่อ/ขยาย บนเมนูทางลัด
-
ในกล่องโต้ตอบ ย่อ/ขยาย ให้พิมพ์หรือวางนิพจน์ต่อไปนี้:
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 เพื่อสร้างนามแฝงของตาราง เพื่อให้คุณสามารถเปรียบเทียบค่าในคิวรีย่อยกับค่าในแถวปัจจุบันของคิวรีหลักได้
-
ในคอลัมน์ที่สี่ของเส้นตาราง ในแถว เขตข้อมูล ให้พิมพ์นิพจน์ต่อไปนี้
Interval: [Order Date]-[Prior Date]
นิพจน์นี้จะคํานวณช่วงเวลาระหว่างวันที่สั่งซื้อแต่ละวันและวันที่สั่งซื้อก่อนหน้าสําหรับผลิตภัณฑ์นั้น โดยใช้ค่าสําหรับวันที่ก่อนหน้าที่เรากําหนดโดยใช้คิวรีย่อย
-
บนแท็บ ออกแบบ ในกลุ่ม ผลลัพธ์ ให้คลิก เรียกใช้
-
คิวรีจะเรียกใช้และแสดงรายการชื่อผลิตภัณฑ์ วันที่สั่งซื้อ วันที่สั่งซื้อก่อนหน้า และช่วงระหว่างวันที่สั่งซื้อ ผลลัพธ์จะถูกเรียงลําดับตาม ID ผลิตภัณฑ์ก่อน (จากน้อยไปหามาก) แล้วเรียงลําดับตามวันที่สั่งซื้อ (จากมากไปหาน้อย)
-
หมายเหตุ: เนื่องจาก ID ผลิตภัณฑ์เป็นเขตข้อมูลการค้นหา ตามค่าเริ่มต้น Access จะแสดงค่าการค้นหา (ในกรณีนี้คือชื่อผลิตภัณฑ์) แทนรหัสผลิตภัณฑ์จริง แม้ว่าจะเปลี่ยนค่าที่ปรากฏ แต่จะไม่เปลี่ยนลําดับการจัดเรียง
-
-
ปิดฐานข้อมูล Northwind
ใช้คิวรีย่อยเป็นเกณฑ์สําหรับเขตข้อมูลคิวรี
คุณสามารถใช้คิวรีย่อยเป็นเกณฑ์ของเขตข้อมูลได้ ใช้คิวรีย่อยเป็นเกณฑ์เขตข้อมูลเมื่อคุณต้องการใช้ผลลัพธ์ของคิวรีย่อยเพื่อจํากัดค่าที่เขตข้อมูลแสดง
ตัวอย่างเช่น สมมติว่าคุณต้องการตรวจทานรายการของใบสั่งที่ประมวลผลโดยพนักงาน ที่ไม่ใช่ พนักงานขาย เมื่อต้องการสร้างรายการนี้ คุณจําเป็นต้องเปรียบเทียบรหัสพนักงานสําหรับแต่ละใบสั่ง กับรายการรหัสพนักงานสําหรับพนักงานที่ไม่ใช่พนักงานขาย เมื่อต้องการสร้างรายการนี้และใช้เป็นเกณฑ์เขตข้อมูล ให้คุณใช้คิวรีย่อย ตามที่แสดงในขั้นตอนต่อไปนี้
-
เปิด Northwind.accdb และเปิดใช้งานเนื้อหา
-
ปิดฟอร์มการเข้าสู่ระบบ
-
บนแท็บ สร้าง ในกลุ่มอื่นๆ ให้คลิก การออกแบบคิวรี
-
บนแท็บ ตาราง ให้ดับเบิลคลิกคําสั่งซื้อและพนักงาน
-
ในตาราง ใบสั่งซื้อ ให้ดับเบิลคลิกที่เขตข้อมูล รหัสพนักงาน เขตข้อมูล ID คําสั่งซื้อ และเขตข้อมูล วันที่สั่งซื้อ เพื่อเพิ่มลงในตารางออกแบบคิวรี ในตาราง พนักงาน ให้ดับเบิลคลิกที่เขตข้อมูล ตําแหน่งงาน เพื่อเพิ่มลงในตารางออกแบบ
-
คลิกขวาที่แถว เกณฑ์ ของคอลัมน์ รหัสพนักงาน แล้วคลิก ย่อ/ขยาย บนเมนูทางลัด
-
ในกล่อง ย่อ/ขยาย ให้พิมพ์หรือวางนิพจน์ต่อไปนี้
IN (SELECT [ID] FROM [Employees]
WHERE [Job Title]<>'Sales Representative')นี่คือคิวรีย่อย โดยจะเลือกรหัสพนักงานทั้งหมด โดยที่พนักงานไม่มีตําแหน่งงานของพนักงานขาย และระบุชุดผลลัพธ์เป็นการสอบถามหลัก คิวรีหลักจะตรวจสอบเพื่อดูว่ารหัสพนักงานจากตารางใบสั่งซื้ออยู่ในชุดผลลัพธ์หรือไม่
-
บนแท็บ ออกแบบ ในกลุ่ม ผลลัพธ์ ให้คลิก เรียกใช้
การสอบถามจะรัน และผลลัพธ์การสอบถามจะแสดงรายการใบสั่งที่ประมวลผลโดยพนักงานที่ไม่ใช่พนักงานขาย
คําสําคัญ SQL ทั่วไปที่คุณสามารถใช้กับคิวรีย่อย
มีคําสําคัญ SQL หลายคําที่คุณสามารถใช้กับคิวรีย่อย:
หมายเหตุ: รายการนี้ยังไม่ครบถ้วน คุณสามารถใช้คําสําคัญ SQL ที่ถูกต้องใดก็ได้ในคิวรีย่อย โดยไม่รวมถึงคําสําคัญของข้อกําหนดข้อมูล
-
ทั้ง หมด ใช้ ALL ในส่วนคําสั่ง WHERE เพื่อเรียกใช้แถวที่ตรงกับเงื่อนไขเมื่อเปรียบเทียบกับทุกแถวที่ส่งกลับโดยคิวรีย่อย
ตัวอย่างเช่น สมมติว่าคุณกําลังวิเคราะห์ข้อมูลนักเรียนที่วิทยาลัย นักเรียนต้องรักษา GPA ขั้นต่ําซึ่งแตกต่างกันไปตามวิชาเอกถึงวิชาเอก วิชาเอกและ GPAs ขั้นต่ําจะถูกเก็บไว้ในตารางที่ชื่อวิชาเอก และข้อมูลนักเรียนที่เกี่ยวข้องจะถูกเก็บไว้ในตารางที่เรียกว่า Student_Records
เมื่อต้องการดูรายการวิชาเอก (และ GPA ขั้นต่ําของนักเรียนทุกคนที่มีวิชาเอกสูงกว่า GPA ขั้นต่ํา คุณสามารถใช้คิวรีต่อไปนี้:
SELECT [Major], [Min_GPA]
FROM [Majors]
WHERE [Min_GPA] < ALL
(SELECT [GPA] FROM [Student_Records]
WHERE [Student_Records].[Major]=[Majors].[Major]); -
ใดๆ ใช้ ANY ในส่วนคําสั่ง WHERE เพื่อเรียกใช้แถวที่ตรงกับเงื่อนไขเมื่อเปรียบเทียบกับแถวอย่างน้อยหนึ่งแถวที่ส่งกลับโดยคิวรีย่อย
ตัวอย่างเช่น สมมติว่าคุณกําลังวิเคราะห์ข้อมูลนักเรียนที่วิทยาลัย นักเรียนต้องรักษา GPA ขั้นต่ําซึ่งแตกต่างกันไปตามวิชาเอกถึงวิชาเอก วิชาเอกและ GPAs ขั้นต่ําจะถูกเก็บไว้ในตารางที่ชื่อวิชาเอก และข้อมูลนักเรียนที่เกี่ยวข้องจะถูกเก็บไว้ในตารางที่เรียกว่า Student_Records
เมื่อต้องการดูรายการวิชาเอก (และ 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
-
EXISTS ใช้ 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]); -
นิ้ว ใช้ 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');