แบบสอบถามย่อยใน FROM ต้องมีนามแฝง


92

ฉันมีแบบสอบถามนี้ที่ฉันเขียนใน PostgreSQL ซึ่งส่งกลับข้อผิดพลาดว่า:

[Err] ข้อผิดพลาด:
LINE 3: FROM (SELECT DISTINCT (identifiant) AS made_only_recharge

นี่คือข้อความค้นหาทั้งหมด:

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'
)

ฉันมีข้อความค้นหาที่คล้ายกันใน Oracle ซึ่งใช้งานได้ดี การเปลี่ยนแปลงเพียงอย่างเดียวคือสิ่งที่ฉันมีEXCEPTใน Oracle ฉันได้แทนที่ด้วยMINUSคำสำคัญ ฉันยังใหม่กับ Postgres และไม่รู้ว่ามันกำลังขออะไร วิธีที่ถูกต้องในการจัดการสิ่งนี้คืออะไร?


3
CALLEDNUMBER = '0130'ดูเหมือนผมยกเว้นไม่จำเป็นต้องเป็นที่ข้อยกเว้นอยู่แล้วมันเป็นครั้งแรก:
Clodoaldo Neto

ข้อผิดพลาดนี้ยังคงเกิดขึ้นกับ Postgres 11 FWIW ...
rogerdpack

คำตอบ:


134

เพิ่มALIASในแบบสอบถามย่อย

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 ขอบคุณสำหรับสิ่งนี้ แต่ทำไมมันถึงต้องการ (ฉันเดาว่าฉันกำลังถามคำถามทฤษฎีที่นี่)?
Andrew Cassidy

1
@AndrewCassidy คุณต้องกำหนดจึงจะสามารถเพิ่มข้อ จำกัด เพิ่มเติมในแบบสอบถามของคุณได้ (WHERE ได้รับตาราง <attribute> = 5) มิฉะนั้นฐานข้อมูลของคุณจะไม่ทราบวิธีอ้างถึงแบบสอบถามย่อย
stackhelper101

37
@AndrewCassidy มันเป็นเพียงไวยากรณ์ที่โชคร้าย ตราบใดที่คุณไม่ได้อ้างถึงเคียวรีย่อยนั้นก็ไม่สำคัญว่าจะเป็นนามแฝงอะไร โดยส่วนตัวฉันใช้AS pg_sucksหมายความว่า "เอาละนี่คุณมีตัวระบุซ้ำซ้อน แต่คุณสามารถสร้างตัวระบุภายในด้วยตัวเองได้ :)
Tregoreg

1

ในกรณีของตารางที่ซ้อนกัน DBMS บางตัวจำเป็นต้องใช้นามแฝงเช่น MySQL และ Oracle แต่คนอื่น ๆ ไม่มีข้อกำหนดที่เข้มงวดเช่นนี้ แต่ยังคงอนุญาตให้เพิ่มเพื่อแทนที่ผลลัพธ์ของแบบสอบถามภายใน


1
ถ้อยคำของคุณแนะนำให้มีคือความต้องการดังกล่าวสำหรับทั้ง Oracle และ MySQL ฉันกำลังอ่านอยู่ใช่ไหม
Scratte

@Scratte ฉันคิดว่าคุณพูดถูกและมีการเปลี่ยนคำพูด "MySQL และ Oracle แต่อื่น ๆ " ควรเป็น "Postgresql แต่ ssuch อื่น ๆ เป็น MySQL และ Oracle" ฉันคิดว่า แน่นอนว่ามันยังคงเป็นประโยครันอยู่และสามารถปรับปรุงเพิ่มเติมได้ คำตอบปี 2013 นั้นใช้ได้และคำตอบนี้ไม่ได้เพิ่มอะไรเลย (แสดงความคิดเห็นในคำตอบ 2013 หากคุณต้องการ) ดังนั้นควรลบคำตอบออก
การชดใช้อย่าง จำกัด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.