简单的SQL查询抛出错误

时间:2014-05-21 16:40:43

标签: sql database oracle

我有一个简单的查询:

SELECT  TEMP.col1, addr1.NAME, addr2.NAME
from    ADDRESS addr1, ADDRESS addr2
where   addr1.ID = TEMP.ID1 AND addr2.ID = TEMP.ID2
and  EXISTS  (  (
           SELECT  t1.col1 as col1,
               t1.id as ID1, 
               t2.id as ID2
           from    table1 t1, table1 t2
           where   t1.id != t2.id ) TEMP );

这个简单的查询抛出“ORA-00907:缺少右括号”错误,看起来我没有错过任何括号。

基本上我有2个表table1和table2。 table1有3列key1,foreign_key1,foreign_key2(这些外键是table2的主键),table2有2列key2,col2。我需要得到table_ table1中foreign_key1!= foreign_key2的所有(key1,col2)对。

2 个答案:

答案 0 :(得分:1)

冒着听起来不敏感的风险,这是一个设计不佳的查询。我假设你是一名从事家庭作业问题的学生。首先,您正在执行Address与其自身的自我加入,但您的加入条件完全来自不同的表格。其次,不同的表甚至不可用,因为它在Exists子句中。

编写Ansi格式化连接的一个优点是,您可以将连接条件与过滤条件(如果有)分开,并更好地查看您的查询正在执行的操作。像这样:

select t1.col1, a1.NAME, a2.NAME
from   table1 t1
join   table2 t2
  on   t2.id <> t1.id
join   address a1
  on   a1.id = t1.id1
join   address a2
  on   a2.id = t2.id1;

这可以更清楚地了解您正在做什么,我认为您不会得到您似乎想要的东西。

如果您只想获得错误的技术说明,则不能为Exists子查询添加别名,因此编译器希望看到第二个右括号,但它会看到AS TEMP

答案 1 :(得分:0)

SELECT  addr1.NAME, addr2.NAME
    from    ADDRESS addr1, ADDRESS addr2
    where  EXISTS  (
               SELECT  t1.col1 as col1,
                   t1.id as ID1, 
                   t2.id as ID2
               from    table1 t1, table1 t2
               where   t1.id != t2.id and addr1.ID = t1.ID and addr2.ID = t2.ID  );