truy vấn con trong FROM phải có bí danh


91

Tôi có truy vấn này mà tôi đã viết trong PostgreSQL trả về lỗi nói:

[Lỗi] LỖI:
DÒNG 3: TỪ (CHỌN DISTINCT (mã nhận dạng) AS made_only_recharge

Đây là toàn bộ truy vấn:

SELECT COUNT (made_only_recharge) AS made_only_recharge
FROM (
    SELECT DISTINCT (identifiant) AS made_only_recharge
    FROM cdr_data
    WHERE CALLEDNUMBER = '0130'
    EXCEPT
    SELECT DISTINCT (identifiant) AS made_only_recharge
    FROM cdr_data
    WHERE CALLEDNUMBER != '0130'
)

Tôi có một truy vấn tương tự trong Oracle hoạt động tốt. Thay đổi duy nhất là nơi tôi có EXCEPTtrong Oracle, tôi đã thay thế nó bằng MINUStừ khóa. Tôi mới sử dụng Postgres và không biết nó đang yêu cầu những gì. Cách chính xác để xử lý điều này là gì?


3
Có vẻ với tôi ngoại trừ là không cần thiết như là người đầu tiên mệnh đề where đã excepts nó: CALLEDNUMBER = '0130'.
Clodoaldo Neto

Lỗi này vẫn xảy ra với Postgres 11 FWIW ...
rogerdpack

Câu trả lời:


133

thêm một ALIASvào truy vấn con,

SELECT  COUNT(made_only_recharge) AS made_only_recharge
FROM    
    (
        SELECT DISTINCT (identifiant) AS made_only_recharge
        FROM cdr_data
        WHERE CALLEDNUMBER = '0130'
        EXCEPT
        SELECT DISTINCT (identifiant) AS made_only_recharge
        FROM cdr_data
        WHERE CALLEDNUMBER != '0130'
    ) AS derivedTable                           -- <<== HERE

18
@JohnWoo cảm ơn vì điều này, nhưng tại sao nó lại cần thiết (tôi đoán tôi đang hỏi một câu hỏi lý thuyết ở đây)?
Andrew Cassidy

@AndrewCassidy Bạn phải xác định để có thể thêm các ràng buộc khác vào truy vấn của mình (WHERE originTable. <attribute> = 5). khác db của bạn sẽ không biết làm thế nào để tham khảo các subquery
stackhelper101

35
@AndrewCassidy Đó chỉ là cú pháp không may mắn. Miễn là bạn không tham chiếu đến truy vấn con đó, không quan trọng bí danh của nó là gì. Theo cá nhân tôi, tôi đang sử dụng AS pg_sucks, có nghĩa là "tốt, ở đây bạn có một số định danh thừa, nhưng bạn có thể tự tạo một số định danh nội bộ, những postgres chết tiệt!" :)
Tregoreg

1

Trong trường hợp các bảng lồng nhau, một số DBMS yêu cầu sử dụng bí danh như MySQL và Oracle nhưng một số khác không có yêu cầu nghiêm ngặt như vậy nhưng vẫn cho phép thêm chúng để thay thế kết quả của truy vấn bên trong.


1
Cách diễn đạt của bạn cho thấy có một yêu cầu như vậy cho cả Oracle và MySQL. Tôi đang đọc nó phải không?
Scratte

@Scratte Tôi nghĩ bạn đúng và từ ngữ đã được xoay chuyển. Tôi nghĩ rằng "MySQL và Oracle nhưng những cái khác" phải là "Postgresql, nhưng khác là MySQL và Oracle". Tất nhiên đó vẫn là một câu chạy và có thể được cải thiện hơn nữa. Câu trả lời năm 2013 là tốt và câu trả lời này không bổ sung gì (bình luận về câu trả lời năm 2013 nếu bạn phải), vì vậy câu trả lời sau nên được loại bỏ.
Sự Chuộc Tội Có Giới Hạn
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.