我必须执行一些用户的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