【问题标题】:Oracle SQL: invalid identifierOracle SQL:标识符无效
【发布时间】:2013-02-17 01:17:10
【问题描述】:

谁能向我解释为什么 dLoad 是 GROUP BY 行中的无效标识符? 这在 Mysql 上运行良好,但我无法让它与 Oracle 一起使用。

CREATE OR REPLACE VIEW DoctorsLoad AS
    SELECT dID, gender, specialty, 'Overloaded' AS dLoad
    FROM Doctor D, Examine E
    WHERE D.dID = E.doctor_id
    GROUP BY dID, gender, specialty, dLoad
    HAVING COUNT(*) > 10
    UNION
    SELECT dID, gender, specialty, 'Underloaded' AS dLoad
    FROM Doctor D, Examine E
    WHERE D.dID = E.doctor_id
    GROUP BY dID, gender, specialty, dLoad
    HAVING COUNT(*) <= 10;

【问题讨论】:

  • 什么是重载?如果它是列名,为什么要引用,然后 dLoad 是列别名,不能在 group by 子句中使用
  • 这是一个常量字符串,将被放置在 dLoad 列中。
  • 与您的问题无关,但您应该在列前加上适当的表别名。生成更“稳定”的 SQL。

标签: sql oracle oracle10g


【解决方案1】:

使用 Oracle RDMS,您不能在 GROUP BY 子句中使用别名,但对于像“Overloaded”这样的文字,您无论如何都不需要将其包含在组中。

CREATE OR REPLACE VIEW DoctorsLoad AS
    SELECT dID, gender, specialty, 'Overloaded' AS dLoad
    FROM Doctor D, Examine E
    WHERE D.dID = E.doctor_id
    GROUP BY dID, gender, specialty
    HAVING COUNT(*) > 10
    UNION ALL
    SELECT dID, gender, specialty, 'Underloaded' AS dLoad
    FROM Doctor D, Examine E
    WHERE D.dID = E.doctor_id
    GROUP BY dID, gender, specialty
    HAVING COUNT(*) <= 10;

我还建议使用UNION ALL,它可以避免过滤操作来删除重复的行。

【讨论】:

  • 谢谢,我可以发誓我尝试将其从 GROUP BY 中删除,但也许我弄错了。这行得通。
猜你喜欢
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多