Tôi đang cố gắng tìm hiểu SQL, sử dụng PostgreSQL 9.1.3. Tôi muốn hiểu một số hành vi khiến tôi bị mâu thuẫn. Để wit:PostgreSQL lồng nhau CTE và UNION
này hoạt động:
WITH innermost AS (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3;
tôi có được điều này:
?column?
----------
2
3
này hoạt động:
WITH outmost AS (
(WITH innermost AS (SELECT 2)
SELECT * FROM innermost)
)
SELECT * FROM outmost;
Kết quả:
?column?
----------
2
này cũng hoạt động:
WITH outmost AS (
SELECT 1
UNION (WITH innermost AS (SELECT 2)
SELECT * FROM innermost)
)
SELECT * FROM outmost;
tôi có được điều này:
?column?
----------
1
2
Nhưng điều này không không công việc:
WITH outmost AS (
SELECT 1
UNION (WITH innermost as (SELECT 2)
SELECT * FROM innermost
UNION SELECT 3)
)
SELECT * FROM outmost;
Kết quả:
ERROR: relation "innermost" does not exist
LINE 4: SELECT * FROM innermost
Theo cách suy nghĩ của tôi, người cuối cùng nên thành công hoặc một trong những người khác sẽ thất bại. Tôi không thấy mẫu. Có một số quy tắc chung nào có thể cho phép tôi dự đoán sự kết hợp của CTE lồng ghép và UNIONs nào sẽ hoặc sẽ không hoạt động?
Mặc dù truy vấn cuối cùng của bạn trông có vẻ khó xử, nó phải là Ok, IMHO. Nó có thể là một lỗi ưu tiên/kết hợp trong trình phân tích cú pháp. Có một số hạn chế ngữ nghĩa (Không có CTE đệ quy lồng nhau, IIRC); có thể trình phân tích cú pháp quá cầu kỳ, hoặc quá kích hoạt. Cá nhân, tôi sử dụng rất nhiều CTE lồng nhau (lên đến 4 cấp độ sâu), nhưng tôi hiếm khi sử dụng UNION, ngoại trừ trong CTE đệ quy. – wildplasser
@AdamMackler bạn nên đặt câu trả lời cho câu hỏi của riêng bạn – araqnid
Tom Lane thừa nhận bạn đã tìm thấy lỗi, giống như một sự chấp thuận chính thức mà bạn đã hỏi một câu hỏi rất hay. Vui lòng đăng nội dung bạn nhận được từ danh sách dưới dạng câu trả lời và đảm bảo thêm liên kết vào chuỗi. –