Các tài liệu PostgreSQL trên VỚI chương trình ví dụ sau:
WITH regional_sales AS (
SELECT region, SUM(amount) AS total_sales
FROM orders
GROUP BY region
), top_regions AS (
SELECT region
FROM regional_sales
WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
)
SELECT region,
product,
SUM(quantity) AS product_units,
SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;
Nó cũng ghi chú:
Một thuộc tính hữu ích của các truy vấn VỚI là chúng chỉ được đánh giá một lần cho mỗi lần thực hiện truy vấn cha, ngay cả khi chúng được truy vấn nhiều lần bởi truy vấn cha hoặc anh chị em với các truy vấn.
Tôi thấy rằng WITHcó thể được sử dụng cho những thứ khác, như đánh giá đệ quy. Nhưng trong ví dụ trên, có sự khác biệt quan trọng nào giữa việc sử dụng WITHvà tạo các bảng tạm thời không?
TEMPORARY TABLEvới ON COMMIT DROPvòng một truy vấn, nó cũng chỉ là vấn đề sửa đổi các truy vấn và tái chạy, phải không? postgresql.org/docs/9.6/static/sql-createtable.html
SELECTvàoWITHchỉ là gõ tên và chạy lại. Trong khi với bảng tạm thời, nó sẽ mấtDROPvàCREATE. Mặt khác, nếu bạn xây dựng một truy vấn và bạn sẽ sử dụng lại dữ liệu tĩnh rất nhiều lần - xây dựng bảng tạm thời với các chỉ mục chắc chắn có lợi cho CTE.