【问题标题】:Sql Subselect ORA-00918Sql 子选择 ORA-00918
【发布时间】:2019-03-08 20:28:13
【问题描述】:

这是我的 Sql:

SELECT 
    t.RUFNAME,
    count(v_anschrift.rufname) as Anrufe
FROM v_termin,
(
    SELECT 
    RUFNAME
    FROM
    V_Anschrift
    WHERE V_ANSCHRIFT.SPERRKZ = 0
    AND V_ANSCHRIFT.OEM != 0 
) t
JOIN v_anschrift ON (t.Rufname = v_anschrift.RUFNAME)
LEFT JOIN v_termin ON (v_termin.anschriftid = v_anschrift.anschriftid)
WHERE v_termin.TERMINART = 20
GROUP BY t.RUFNAME;

我收到此错误消息:

ORA-00918:Spalte nicht eindeutig 定义 00918. 00000 - “列定义不明确” *原因:
*行动: Zeile 的 Fehler:15 Spalte:7

我的错误在哪里?

【问题讨论】:

  • 不要混合显式和隐式连接。随处切换到现代、明确的JOIN 语法!更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接。
  • 您在 FROM 子句中有两次 v_termin。故意地?有不同的表别名。
  • 你为什么要两次加入v_anschrift?和v_termin?对sperrkzoem 的限制可以很容易地添加到连接条件中。我看不出有一个子选择开始的理由。
  • 简单:你有一个FROM v_termin,然后是一个LEFT JOIN v_termin,你没有正确别名你的表,​​所以Oracle不能从哪个表中分辨出@ 987654330@。我开始写一个修复,但我停止了,因为你的查询很乱,尤其是没有 ON CLAUSE 的子查询。
  • 死你的意思是这样的:cryptb.in/L7rn

标签: sql oracle


【解决方案1】:

我怀疑你实际上想要这样的东西:

SELECT t.RUFNAME, COUNT(*) as  Anrufe
FROM v_termin t JOIN
     v_anschrift a
     ON t.anschriftid = a.anschriftid
WHERE t.TERMINART = 20 AND
      a.SPERRKZ = 0 AND
      a.OEM <> 0 
GROUP BY t.RUFNAME;

您在FROM 子句中重复了表引用——并且重复没有明显的逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多