คำสั่ง select ที่ซ้อนกันใน SQL Server


387

ทำไมงานต่อไปนี้ไม่ทำงาน

SELECT name FROM (SELECT name FROM agentinformation)

ฉันเดาว่าความเข้าใจ SQL ของฉันผิดเพราะฉันคิดว่าสิ่งนี้จะกลับมาเหมือนเดิม

SELECT name FROM agentinformation

ชุดคำสั่ง select ด้านในไม่สร้างชุดผลลัพธ์ซึ่งคำสั่ง SELECT ส่วนนอกแล้วสอบถาม?

คำตอบ:


672

คุณต้องนามแฝงแบบสอบถามย่อย

SELECT name FROM (SELECT name FROM agentinformation) a  

หรือเพื่อให้ชัดเจนยิ่งขึ้น

SELECT a.name FROM (SELECT name FROM agentinformation) a  

76
ตรวจสอบให้แน่ใจว่านามแฝงของคุณค่อนข้างละเอียดเช่นกัน! ฉันรักเมื่อฉันได้ทำงานที่โรงเรือนด้วย t1, t2, t3, t4, t5, t6
Doug Chamberlain

2
ส่วนwhereคำสั่งจะไปที่ไหนสำหรับการสืบค้นภายนอก
พันเอก Panic

3
@ ColonelPanic: ส่วนคำสั่ง WHERE สำหรับการสืบค้นภายนอกจะถูกตรึงไว้ที่ท้ายสุด
Joe Stefanelli

"ถูกต้องฉันเป็นคนงี่เง่า! ขอบคุณจะยอมรับเมื่อได้รับอนุญาต" Nah แค่งมงาย ชอบพวกเราทุกคน
Lucio Mollinedo

2
Oracle ยอมรับครั้งแรกselectโดยไม่มีนามแฝง
Kjetil S.

49

คำตอบให้โดยโจ Stefanelli ถูกต้องอยู่แล้ว

SELECT name FROM (SELECT name FROM agentinformation) as a  

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

งบที่มีแบบสอบถามย่อยมักจะใช้หนึ่งในรูปแบบเหล่านี้:

  • ที่นิพจน์ [ไม่] ใน (แบบสอบถามย่อย)
  • WHERE expression_operator เปรียบเทียบ [ANY | ทั้งหมด] (แบบสอบถามย่อย)
  • WHERE [ไม่] EXISTS (แบบสอบถามย่อย)

ตรวจสอบกฎคิวรีย่อยและประเภทเคียวรีเพิ่มเติม

ตัวอย่างเพิ่มเติมของแบบสอบถามย่อยที่ซ้อนกัน

  1. IN / NOT IN - ตัวดำเนินการนี้ใช้เอาต์พุตของเคียวรีภายในหลังจากเคียวรีภายในถูกเรียกใช้งานซึ่งอาจเป็นศูนย์หรือมากกว่าค่าและส่งไปยังเคียวรีด้านนอก คิวรีด้านนอกจะดึงแถว [ผู้ดำเนินการ IN] ที่ตรงกันทั้งหมดหรือไม่ตรงกับแถว [ไม่ใช่ผู้ดำเนินการ]

  2. ANY - [> ANY หรือตัวดำเนินการใด ๆ ใช้รายการของค่าที่สร้างโดยการสืบค้นภายในและดึงค่าทั้งหมดที่มากกว่าค่าต่ำสุดของรายการ

เช่น> ANY (100,200,300) ตัวดำเนินการใด ๆ จะดึงค่าทั้งหมดที่มากกว่า 100

  1. ALL - [> ALL หรือ ALL โอเปอเรเตอร์รับรายการค่าที่สร้างโดยเคียวรีด้านในและดึงค่าทั้งหมดที่มากกว่าค่าสูงสุดของรายการ

เช่น> ALL (100,200,300) ตัวดำเนินการทั้งหมดจะดึงค่าทั้งหมดที่มากกว่า 300

  1. EXISTS - คำหลัก EXISTS สร้างค่าบูลีน [TRUE / FALSE] EXISTS นี้ตรวจสอบการมีอยู่ของแถวที่ส่งคืนโดยเคียวรีย่อย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.