使用表格转换

时间:2011-03-07 17:26:12

标签: oracle plsql oracle10g

你可以在

行上使用一些东西吗?
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行)

2 个答案:

答案 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