2013-02-08 36 views
52

Tôi đã truy vấn này tôi đã viết trong PostgreSQL trả về một lỗi nói:subquery trong TỪ phải có một bí danh

[Err] ERROR:
LINE 3: FROM (SELECT DISTINCT (identifiant) 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 câu hỏi tương tự trong Oracle hoạt động tốt. Thay đổi duy nhất là nơi tôi có EXCEPT trong Oracle tôi đã thay thế bằng từ khóa MINUS. Tôi mới sử dụng Postgres và không biết nó đang yêu cầu cái gì. Cách xử lý đúng cách này là gì?

+1

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''. –

Trả lời

72

thêm một ALIAS trên subquery,

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 
+9

@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)? –

+0

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

+9

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

Các vấn đề liên quan