Nhiều thao tác sử dụng VỚI


16

Có cách nào để thực thi nhiều thao tác bằng cách sử dụng WITHcâu lệnh không?

Cái gì đó như

WITH T AS
(
  SELECT * FROM Tbl
)
BEGIN
  OPEN P_OUTCURSOR FOR
    SELECT * FROM T;

  SELECT COUNT(*) INTO P_OUTCOUNT FROM T;
END;

Tôi muốn chọn một số dữ liệu và số lượng của nó ...

Câu trả lời:


17

Bạn chỉ có thể có một tuyên bố sau CTE. Tuy nhiên, bạn có thể xác định các CTE tiếp theo dựa trên một CTE trước đó:

WITH t1 AS (
   SELECT a, b, c
   FROM table1
)
, t2 AS (
   SELECT b
   FROM t1
   WHERE a = 5
)
SELECT *
FROM t2;

Cho rằng bạn đang cố gắng đếm các hàng và điền một con trỏ ref từ cùng một tập kết quả, có thể phù hợp hơn để thực hiện một trong các thao tác sau:

  • tạo một cái nhìn
  • giai đoạn kết quả tạm thời trong một bảng tạm thời

Cuối cùng, nếu truy vấn đủ đơn giản, chỉ cần viết nó một lần cho số đếm và một lần nữa cho con trỏ. Đơn giản và dễ đọc là nguyên tắc DRY trong trường hợp này.


10

Không, CTE hoặc withmệnh đề được xác định trong phạm vi của một câu lệnh

Đôi khi, bạn có thể làm nhiều hơn những gì bạn mong đợi chỉ với một câu lệnh, ví dụ:

with w as (select v from t3)
insert all into t1(v) values(v)
           into t2(v) values(v)
select v from w;

Cách Oracle 'bình thường' để lưu trữ các tập kết quả tạm thời (nếu bạn phải) là sử dụng bảng GTT :
GLOBAL TEMPORARY
.

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.