引用祖父母列的SQL嵌套子查询
我对一份报告有一个特别复杂的疑问。它从一个视图中选择多个列,并且必须通过聚合连接多个字段来构建一个列。更复杂的是,连接必须包含3个字段,即使有0个字段。实际上,连接是逗号分隔的,因此仍然会注意到空字段 我们正在使用Oracle 11.1.0.7.0 为了提供不必要的向后兼容性,我们使用了xmlagg函数来执行连接,我相信这在oracle8或9之后就已经存在了 这个例子将被简化,但我觉得它提供了足够的信息。换句话说,请不要将重点放在规范化表结构上,这只是一个严格的示例引用祖父母列的SQL嵌套子查询,sql,oracle,Sql,Oracle,我对一份报告有一个特别复杂的疑问。它从一个视图中选择多个列,并且必须通过聚合连接多个字段来构建一个列。更复杂的是,连接必须包含3个字段,即使有0个字段。实际上,连接是逗号分隔的,因此仍然会注意到空字段 我们正在使用Oracle 11.1.0.7.0 为了提供不必要的向后兼容性,我们使用了xmlagg函数来执行连接,我相信这在oracle8或9之后就已经存在了 这个例子将被简化,但我觉得它提供了足够的信息。换句话说,请不要将重点放在规范化表结构上,这只是一个严格的示例 person_view --
person_view
-----------
name
phone
address
position_id
position_table
--------------
position_id
position_title
因此,我们目前的查询(我承认我不是SQL专家)是这样的:
select
name,
phone,
address,
(select
xmlagg(xmlelement(e, position_title || ',')).extract('//text()')
from
(select
position_title
from
position_table
where
position_table.position_id = person_view.position_id and
rownum <= 3
union all select '' from dual
union all select '' from dual
union all select '' from dual
)
where
rownum <= 3
)
from
person_view
我的实际错误是,似乎确保至少3行输入的子查询无法引用祖父母查询来确定person\u view.position\u id
我获得ORA-00904:人员\视图。位置\ ID:无效标识符
性能不是一个大问题,因为这是一个不会定期运行的报告,但我需要找到一个解决方案,用绝对3列数据聚合这些数据。非常感谢您提供任何帮助重写查询或允许子查询访问相关祖父母列的指导。这是Oracle SQL中的一个限制:您不能从深度超过1级的子查询中引用父查询元素 在这种情况下,我将使用函数:
CREATE OR REPLACE FUNCTION get_title(p_position_id NUMBER) RETURN VARCHAR2 IS
l_result LONG;
l_position_num NUMBER := 0;
BEGIN
FOR cc IN (SELECT position_title
FROM position_table
WHERE position_table.position_id = p_position_id
AND rownum <= 3) LOOP
l_result := cc.position_title || ',';
l_position_num := l_position_num + 1;
END LOOP;
RETURN l_result || rpad(',', 3 - l_position_num, ',');
END;
+1对于写得很好的问题。我希望它们都能如此清晰地呈现出来。这是一个一致的限制还是一个bug?我以前也遇到过类似的问题,但我认为从理论上讲,你应该能够从任何层面进行参考。例如,该语句适用于10.2.0.1.0上的6个级别:选择测试。dual from dual from dual from dual from dual from dual from dual from dual from dual from dual from dual from dual from dual from dual from dual test@jonearles:这是一个已知的一致性限制,例如。您的案例非常有趣,似乎仍然被认为是一个层次的深度[子查询都是标量子查询]。这不起作用,例如:从选择测试中选择xx。从双重测试中选择虚拟xx
select
name,
phone,
address,
get_title(p.position_id) title
from person_view p