ORA-00907: 两个子查询的左连接缺少右括号

Posted

技术标签:

【中文标题】ORA-00907: 两个子查询的左连接缺少右括号【英文标题】:ORA-00907: Missing Right Parenthesis on a left join of two subqueries 【发布时间】:2021-01-19 20:46:53 【问题描述】:

自从我弄乱 SQL 以来已经有一段时间了,我正在为一门课程学习它。我需要为我的用户的所有表创建一个包含表名、列名、约束名和约束类型的表,但是每次尝试时,都会出现缺少右括号的错误。到目前为止,这是我的代码:

SELECT table_name, column_name, constraint_name, constraint_type 
FROM     
(
     SELECT a.table_name, a.column_name, a.constraint_name FROM all_cons_columns AS a
     WHERE a.owner = '[my_user]'
     AND a.table_name NOT LIKE 'APEX%'
     AND a.constraint_name NOT LIKE 'BIN%'
     ORDER BY a.table_name
) AS x
LEFT JOIN
(
     SELECT b.constraint_name, b.constraint_type FROM all_constraints AS b
     WHERE b.owner = '[my_user]'
     AND b.table_name NOT LIKE 'APEX%'
     AND b.constraint_name NOT LIKE 'BIN%'
     ORDER BY b.constraint_name
) AS y
ON x.constraint_name = y.constraint_name

SQL Developer 说它在第 4 行的“AS a”处,但我在网上找不到太多信息。非常感谢任何帮助!

【问题讨论】:

如果你在你的表(对于别名)之后删除了 AS 关键字,这可能会起作用。所以以 FROM all_cons_columns 为例。 同时从子查询中删除ORDER BY。不是语法问题,但也没有做任何有用的事情。 糟糕,我复制了包含 ORDER BY 的代码,但已将其删除。我尝试删除 AS a 和 AS b 并且该错误消失了,然后在 AS x 上标记为“SQL 语句未正确结束”。嗯 【参考方案1】:

如果您删除 AS,它会起作用:

   SELECT table_name, column_name, x.constraint_name, constraint_type
      FROM (SELECT a.table_name, a.column_name, a.constraint_name
              FROM all_cons_columns  a
             WHERE a.owner = '[my_user]'
               AND a.table_name NOT LIKE 'APEX%'
               AND a.constraint_name NOT LIKE 'BIN%'
             ORDER BY a.table_name) x
              LEFT JOIN (SELECT b.constraint_name, b.constraint_type
                    FROM all_constraints b
                   WHERE b.owner = '[my_user]'
                     AND b.table_name NOT LIKE 'APEX%'
                     AND b.constraint_name NOT LIKE 'BIN%'
                   ORDER BY b.constraint_name) y
          ON x.constraint_name = y.constraint_name

但我想这个查询可能更短并且没有左连接,因为它总是匹配:

select x.table_name,
       x.column_name,
       x.constraint_name,
       y.constraint_type
  from all_cons_columns x
  join all_constraints y
    on x.constraint_name = y.constraint_name
 where x.owner = '[my_user]'
   and x.owner = y.owner
   and x.table_name NOT LIKE 'APEX%'
   and x.constraint_name NOT LIKE 'BIN%'
 order by x.table_name, x.constraint_name

【讨论】:

我不认为constraint_nameall_constraints 的唯一键,您可能需要将and x.owner = y.owner 添加到联接中。但除此之外还不错。 谢谢你,kfinity,我完全同意你的看法。我已更正查询。 太好了,谢谢大家!绝对需要处理我的简单查询【参考方案2】:

在 Oracle SQL 中,AS 关键字可用于列别名,但不能用于表别名。

这很好:

SELECT dummy AS x FROM dual

这将产生“ORA-00933:SQL 命令未正确结束”:

SELECT dummy FROM dual AS x

或者在嵌套子查询中,它会产生“ORA-00907:缺少右括号”,就像您最初遇到的那样:

 SELECT * FROM (SELECT dummy FROM dual AS x)

要给表起别名,只需省略 AS。这有效:

SELECT dummy FROM dual x

(附带说明,虽然列别名允许使用 AS,但它不是必需的。)

【讨论】:

以上是关于ORA-00907: 两个子查询的左连接缺少右括号的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00907: SQL 中的自然连接缺少右括号

ORA-00907: 缺少右括号 2

ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号” *原因:*操作:行错误:44 列:30

获取 ORA-00907 的 Oracle 查询:缺少右括号

ORDER BY 与内部查询,给出 ORA-00907 缺少右括号

ORA-00907: 缺少右括号