เราสามารถมี“ WITH AS” หลายตัวใน sql เดียวได้หรือไม่ - Oracle SQL


102

ฉันมีคำถามง่ายๆ: oracle อนุญาต "WITH AS" หลายรายการในคำสั่ง sql เดียวหรือไม่

ตัวอย่าง:

WITH abc AS( select ......)

WITH XYZ AS(select ....) /*This one uses "abc" multiple times*/

Select ....   /*using XYZ multiple times*/

ฉันสามารถทำให้การสืบค้นทำงานได้โดยการทำแบบสอบถามเดียวกันซ้ำหลาย ๆ ครั้ง แต่ไม่ต้องการทำเช่นนั้นและใช้ประโยชน์จาก "WITH AS" ดูเหมือนเป็นข้อกำหนดง่ายๆ แต่ oracle ไม่อนุญาตให้ฉัน:

ORA-00928: ไม่มีคำหลัก SELECT

คำตอบ:


192

คุณสามารถทำได้ดังนี้:

WITH abc AS( select
             FROM ...)
, XYZ AS(select
         From abc ....) /*This one uses "abc" multiple times*/
  Select 
  From XYZ....   /*using abc, XYZ multiple times*/

2
เราสามารถใช้นามแฝงจากแบบสอบถามย่อยแรกไปยังแบบสอบถามย่อยที่สองได้หรือไม่ ในกรณีนี้abcและxyzเคียวรีย่อย? ฉันต้องการรับผลลัพธ์ของแบบสอบถามย่อยแรกและใช้กับแบบสอบถามย่อยที่สอง
แว็กซ์

@Wax ฉันสามารถใช้นามแฝงจากแบบสอบถามย่อยแรกในแบบสอบถามย่อยที่สองได้โดยไม่มีปัญหาเหมือนที่คำตอบด้านบนแนะนำ ฉันยังสามารถใช้นามแฝงและคอลัมน์จากทั้งสองตารางในแบบสอบถามหลัก
cleberz

คำตอบที่สมบูรณ์แบบ
InfiniteFlash

29

ไวยากรณ์ที่ถูกต้องคือ -

with t1
as
(select * from tab1
where conditions...
),
t2
as
(select * from tab2
where conditions...
(you can access columns of t1 here as well)
)
select * from t1, t2
where t1.col1=t2.col2;

5
"คุณสามารถเข้าถึงคอลัมน์ของ t1 ได้ที่นี่เช่นกัน" มีประโยชน์มากที่จะชี้ให้เห็น
เบรน

10

ใช่คุณสามารถ...

WITH SET1 AS (SELECT SYSDATE FROM DUAL), -- SET1 initialised
     SET2 AS (SELECT * FROM SET1)        -- SET1 accessed
SELECT * FROM SET2;                      -- SET2 projected

10/29/2013 10:43:26 AM

ทำตามลำดับที่ควรเริ่มต้นใน Common Table Expressions


3

Aditya หรืออื่น ๆ คุณสามารถเข้าร่วมหรือจับคู่ t2 กับ t1 ในตัวอย่างของคุณได้หรือไม่เช่นแปลเป็นรหัสของฉัน

with t1 as (select * from AA where FIRSTNAME like 'Kermit'),
     t2 as (select * from BB B join t1 on t1.FIELD1 = B.FIELD1)

ฉันไม่ชัดเจนว่ารองรับเฉพาะ WHERE สำหรับการเข้าร่วมหรือวิธีการเข้าร่วมแบบใดที่รองรับในเอนทิตีที่ 2 ด้วย ตัวอย่างบางส่วนมี WHERE A = B อยู่ด้านล่างในเนื้อหาของส่วนคำสั่งที่เลือก "ด้านล่าง" ด้วย

ข้อผิดพลาดที่ฉันได้รับตามการประกาศด้วยเหล่านี้คือตัวระบุ (ชื่อฟิลด์) ใน B ไม่รู้จักลงในเนื้อความของ SQL ที่เหลือ ดังนั้นไวยากรณ์ WITH ดูเหมือนว่าจะทำงานตกลง แต่ไม่สามารถเข้าถึงผลลัพธ์จาก t2 ได้


คุณต้องเหมือนกับ t1 ภายใน t2 ด้วยประโยค
เบ็น

ฉันจะอ้างอิงกับตารางประโยคภายในแบบสอบถามย่อยได้อย่างไร มันทำให้เกิดข้อผิดพลาด ตัวอย่างเช่นด้วย SET1 AS (SELECT SYSDATE FROM DUAL) - SET1 เริ่มต้น SET2 AS (SELECT * FROM SET1) - SET1 เข้าถึง SELECT * FROM SET2 LEFT OUTER JOIN (เลือก * จาก SET1 โดยที่ sysdate = now ()) set3 บน set1.sysdate = set3.sysdate;
Rupasa Sushma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.