使用rownums在子查询中模糊定义的列

时间:2011-11-02 10:44:48

标签: sql pagination subquery ambiguous ora-00918

我必须执行一些用户编写的SQL并显示其结果。一个示例SQL可能是这样的:

SELECT t1.*, t2.* FROM table1 t1, table2 t2, where table1.id = table2.id

这个SQL工作正常,但我需要手动添加分页并显示rownum,所以SQL最终会这样。

SELECT z.* 
FROM(       
    SELECT y.*, ROWNUM rn
    FROM (                   
        SELECT t1.*, t2.* FROM table1 t1, table2 t2, where table1.id = table2.id
    ) y      
    WHERE ROWNUM <= 50) z         
WHERE rn > 0

这会引发异常:“ORA-00918:列模糊定义”,因为Table1和Table2都包含一个具有相同名称(“id”)的字段。

避免这种情况的最佳方法是什么?

问候。

  • 更新

最后,我们不得不采用丑陋的方式并在执行它们之前解析每个SQL。基本上,我们解决了星号,以发现我们需要添加哪些字段,并使用唯一ID为每个字段添加别名。这引入了性能损失,但我们的客户理解这是满足要求的唯一选择。

我会将Lex的答案标记为我们最终解决的问题。

4 个答案:

答案 0 :(得分:3)

我认为你必须为table1.id和table2.id中的(至少一个)指定别名。并且可能还有任何其他相应的列名。

所以代替SELECT t1.*, t2.* FROM table1 t1, table2使用类似的东西:

SELECT t1.id t1id, t2.id t2id [rest of columns] FROM table1 t1, table2 t2

我不熟悉Oracle语法,但我认为你会明白这一点。

答案 1 :(得分:2)

我正在寻找类似的答案。我正在引用一个别名的子查询,它有几个NULL列。我必须为NULL列添加别名,因为我有多个;

选择。*,t2.column,t2.column,t2.column (从t1中选择t1.column,t1.column,NULL,NULL,t1.column 其中t1 ='VALUE')a 在t2.column = t1.column;

上左外连接t2

一旦我在子查询中别名NULL列,它就可以正常工作。

答案 2 :(得分:1)

如果您可以在语法上修改查询(或让用户这样做)使用 JOIN 子句的显式USING语法,这将自动解决问题在手:

SELECT t1.*, t2.*
FROM   table1 t1
JOIN   table2 t2 USING (id)

USING子句与ON t1.id = t2.id(或问题中隐含的JOIN)相同,但结果中只剩下一个id列,从而消除了你的问题。

如果有更多列具有相同名称但未包含在USING子句中,则仍会遇到问题。 @Lex描述的别名是必不可少的。

答案 3 :(得分:0)

使用替换空值功能来解决此问题。

SELECT z.* 
FROM(       
    SELECT y.*, ROWNUM rn
    FROM (                   
        SELECT t1.*, t2.* FROM table1 t1, table2 t2, where 

        NVL(table1.id,0) = NVL(table2.id,0)

    ) y      
    WHERE ROWNUM <= 50) z         
WHERE rn > 0