1

我必须执行一些用户创建的 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: column ambiguously defined”,因为 Table1 和 Table2 都包含具有相同名称(“id”)的字段。

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

问候。

  • 更新

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

我将标记 Lex 答案,因为它是我们最终研究的解决方案。

4

4 回答 4

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 语法,但我想你会明白的。

于 2011-11-02T10:47:46.270 回答
2

我正在寻找类似问题的答案。我引用了一个有几个 NULL 列的别名子查询。我不得不给 NULL 列起别名,因为我有不止一个;

select a.*, t2.column, t2.column, t2.column (select t1.column, t1.column, NULL, NULL, t1.column from t1 where t1='VALUE') t2 上的左外连接 t2。列=t1.列;

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

于 2012-04-26T22:17:44.673 回答
1

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

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

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

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

于 2012-04-26T22:35:48.607 回答
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
于 2016-09-09T07:46:05.597 回答