在使用行数的子查询中定义不明确的列



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

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

这个SQL可以正常工作,但是我需要手动添加分页并显示行数,所以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: column ambiguous defined",因为Table1和Table2都包含一个具有相同名称("id")的字段。

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

致意。

最后,我们不得不采用难看的方式,在执行每个SQL之前解析它们。基本上,我们通过解析星号来发现需要添加的字段,并使用唯一id为每个字段命名。这带来了性能损失,但我们的客户明白这是考虑到需求的唯一选择。

我会标记Lex的答案,因为这是我们最终的解决方案。

我认为您必须为(至少一个)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语法,但我想你会明白的。

我正在寻找类似问题的答案。我引用了一个有几个NULL列的别名子查询。我必须对NULL列进行别名,因为我有多个;

select a.*, t2。列,t2。列,t2.column(选择t1。列,t1。列,NULL, NULL, t1。从t1开始的列其中t1='VALUE') a

左外连接t2 on t2.column=t1.column;

一旦我在子查询中添加了NULL列的别名,它工作得很好。

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

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

USING子句与ON t1.id = t2.id(或您在问题中隐含的JOIN)的操作相同,只是结果中只保留一个id列,从而消除了您的问题。

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

使用replace null values函数来解决这个问题。

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

相关内容

  • 没有找到相关文章

最新更新