你可以在
行上使用一些东西吗?Select * from table(cast(select * from tab1 inner join tab2)) inner join tab3
考虑到表格内部的内容(cast())比简单的选择要复杂得多,例如使用test作为(select)select * ...等。
我需要一种简单的方法来做到这一点,而不需要临时表。
谢谢。
数据库:Oracle 10g
LE
我有类似
的东西Select a.dummy1, a.dummy2, wm_concat(t2.dummy3)
from table1 a,
(with str as
(Select '1,2,3,4' from dual)
Select a.dummy1, t.dummy3
from table1 a
inner join
(Select regexp_substr (str, '[^,]+', 1, rownum) split
from str
connect by level <= length (regexp_replace (str, '[^,]+')) + 1) t
on instr(a.dummy2, t.split) > 0) t2
where a.dummy1='xyz'
group by a.dummy1, a.dummy2
主要思想是列t2.dummy3包含CSV。这就是为什么我从双重选择'1,2,3,4'。 我需要查找包含str中的至少一个值的所有行。
使用任何类型的循环都是不可能的,因为我需要将其集成到用于SSRS中的报表的更大查询中,并且所需的表非常大(> 1mil行)
答案 0 :(得分:4)
CAST
似乎完全无关紧要。您使用CAST
更改表达式的感知数据类型。在这里,您传递的是结果集,而不是表达式,并且您没有说要转换为什么数据类型。
您应该可以简单地删除TABLE和CAST调用,并执行以下操作:
SELECT * FROM (SELECT * FROM tab1 INNER JOIN tab2 ON ...) INNER JOIN tab3 ON ...
e.g。
SELECT * FROM
(SELECT d1.dummy FROM dual d1 INNER JOIN dual d2 ON d1.dummy=d2.dummy) d12
INNER JOIN dual d3 ON d12.dummy = d3.dummy
子查询因子在这里也应该可以正常工作。
WITH x AS (SELECT * FROM DUAL)
SELECT * FROM
(SELECT d1.dummy FROM x d1 INNER JOIN x d2 ON d1.dummy=d2.dummy) d12
INNER JOIN dual d3 ON d12.dummy = d3.dummy;
如果您无法使这种构造发挥作用,请尝试在问题中添加更多详细信息,具体说明您尝试过的内容以及您遇到的错误。
答案 1 :(得分:0)
是的......我找到了答案......我只是看到了SQL,因为它正好在我面前......
我只是在查询之外使用了“with”语句并且它有效。
非常感谢你的帮助,这是你的回答让我看到了我的错误:D
类似的东西:
with str as
(Select '1,2,3,4' from dual)
Select a.dummy1, a.dummy2, wm_concat(t2.dummy3)
from table1 a,
(
Select a.dummy1, t.dummy3
from table1 a
inner join
(Select regexp_substr (str, '[^,]+', 1, rownum) split
from str
connect by level <= length (regexp_replace (str, '[^,]+')) + 1) t
on instr(a.dummy2, t.split) > 0) t2
where a.dummy1='xyz'
group by a.dummy1, a.dummy2