Tek sql - Oracle SQL'de birden fazla "WITH AS" olabilir mi


102

Çok basit bir sorum vardı: Oracle tek bir sql ifadesinde birden çok "WITH AS" kullanımına izin veriyor mu?

Misal:

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

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

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

Aynı sorguyu birden çok kez tekrarlayarak sorgunun çalışmasını sağlayabilirim, ancak bunu yapmak istemiyorum ve "AS İLE" seçeneğinden yararlanıyorum. Basit bir gereklilik gibi görünüyor ama oracle bana izin vermiyor:

ORA-00928: eksik SELECT anahtar kelimesi

Yanıtlar:


192

Bunu şu şekilde yapabilirsiniz:

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
İlk alt sorudan ikinci alt sorguya kadar takma ad kullanabilir miyiz? Bu durumda abcve xyzalt sorgular? İlk alt sorgunun sonucunu almam ve ikinci alt sorguda kullanmam gerekiyor.
Wax

@Wax İkinci alt sorgudaki ilk alt sorgudaki takma adları, yukarıdaki yanıtın önerdiği gibi sorunsuz bir şekilde kullanabiliyorum. Ana sorguda her iki tablodan da takma adları ve sütunları kullanabildim.
cleberz

Mükemmel cevap.
InfiniteFlash

29

doğru sözdizimi -

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'in sütunlarına buradan da erişebilirsiniz" belirtmek çok yardımcı oldu.
Bren

10

Evet yapabilirsin...

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

Ortak Tablo İfadelerinde başlatılması gereken sırayı izleyin


3

Aditya veya diğerleri, örneğinizde t2 ile t1'i birleştirebilir veya eşleştirebilir misiniz, yani benim koduma çevrilebilir misiniz?

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

Katılmak için yalnızca NEREDE desteklendiğinden veya 2nd WITH varlığında hangi birleştirme yaklaşımının desteklendiğinden emin değilim. Örneklerden bazıları, WITH yan tümcelerinin "altında" seçim gövdesinde WHERE A = B'ye sahiptir.

Bu WITH bildirimlerini takip ettiğim hata, B'deki tanımlayıcıların (alan adları) SQL'in geri kalanının gövdesinde tanınmamasıdır. Dolayısıyla, WITH sözdizimi iyi çalışıyor gibi görünüyor, ancak sonuçlara t2'den erişilemiyor.


T2 içinde cümle ile
Ben

Alt sorgu içindeki yan tümce tablosuna nasıl başvurabilirim? bir hata veriyor. örneğin, SET1 AS İLE (ÇİFTTEN SYSDATE SEÇ), - SET1, SET2 AS'yi başlattı (SET1'DEN SEÇ *) - SET1'e erişti SELECT * SET2'den LEFT OUTER JOIN (SET1'den * seçin, burada sysdate = şimdi ()) set3 on set1.sysdate = set3.sysdate;
Rupasa Sushma
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.