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.