我必须执行一些用户编写的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的答案标记为我们最终解决的问题。
答案 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