Chúng ta có thể có nhiều “WITH AS” trong một sql không - Oracle SQL


102

Tôi có một câu hỏi rất đơn giản: oracle có cho phép nhiều "WITH AS" trong một câu lệnh sql không.

Thí dụ:

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

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

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

Tôi có thể làm cho truy vấn hoạt động bằng cách lặp lại cùng một truy vấn nhiều lần, nhưng tôi không muốn làm điều đó và tận dụng "VỚI NHƯ". Nó có vẻ như là một yêu cầu đơn giản nhưng oracle không cho phép tôi:

ORA-00928: thiếu từ khóa SELECT

Câu trả lời:


190

Bạn có thể làm như sau:

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
Chúng ta có thể sử dụng bí danh từ truy vấn con đầu tiên đến truy vấn con thứ hai không? Trong trường hợp này các truy vấn phụ abcxyz? Tôi cần lấy kết quả của truy vấn con đầu tiên và sử dụng nó trên truy vấn con thứ hai.
Wax

@Wax Tôi có thể sử dụng bí danh từ truy vấn con đầu tiên trong truy vấn con thứ hai mà không có vấn đề gì, giống như câu trả lời ở trên gợi ý. Tôi cũng có thể sử dụng bí danh và cột từ cả hai bảng trong truy vấn chính.
cleberz

Câu trả lời hoàn hảo.
InfiniteFlash

29

cú pháp đúng là -

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
"bạn cũng có thể truy cập các cột của t1 tại đây" rất hữu ích để chỉ ra.
Bren

10

Có bạn có thể ...

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

Thực hiện theo thứ tự mà nó sẽ được khởi tạo trong Biểu thức bảng chung


3

Aditya hoặc những người khác, bạn có thể kết hợp hoặc đối sánh t2 với t1 trong ví dụ của bạn, tức là được dịch sang mã của tôi,

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

Tôi không rõ liệu chỉ WHERE được hỗ trợ để tham gia hay phương pháp tham gia nào được hỗ trợ trong thực thể WITH thứ 2. Một số ví dụ có WHERE A = B trong phần nội dung của lựa chọn "bên dưới" mệnh đề VỚI.

Lỗi mà tôi gặp phải khi làm theo các khai báo WITH này là các mã định danh (tên trường) trong B không được nhận dạng, nằm trong phần thân của phần còn lại của SQL. Vì vậy, cú pháp WITH có vẻ chạy OK, nhưng không thể truy cập kết quả từ t2.


Bạn cần phải alia t1 trong điều khoản t2
Ben

Làm cách nào tôi có thể tham chiếu với bảng mệnh đề bên trong truy vấn phụ? nó đang tạo ra một lỗi. ví dụ: VỚI SET1 AS (CHỌN SYSDATE TỪ KÉP), - SET1 khởi tạo SET2 AS (CHỌN * TỪ SET1) - SET1 được truy cập CHỌN * TỪ SET2 LEFT OUTER JOIN (chọn * từ SET1 nơi sysdate = now ()) set3 trên set1.sysdate = set3.sysdate;
Rupasa Sushma
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.