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_name
是all_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: 缺少右括号 00907. 00000 - “缺少右括号” *原因:*操作:行错误:44 列:30
获取 ORA-00907 的 Oracle 查询:缺少右括号