【问题标题】:Using Table Cast使用表投射
【发布时间】:2011-03-07 17:26:12
【问题描述】:

你能用什么就行了

Select * from table(cast(select * from tab1 inner join tab2)) inner join tab3

考虑到 table(cast()) 中的内容比涉及块的简单选择要复杂得多,例如 with test as (select) select *... 等。

我需要一种简单的方法来执行此操作,最好不需要临时表。

谢谢。

数据库:Oracle 10g

乐:

我有类似的东西

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 中的报告的更大查询中,并且为此所需的表非常大(>100 万行)

【问题讨论】:

    标签: oracle plsql oracle10g


    【解决方案1】:

    CAST 在这里似乎完全无关紧要。您可以使用CAST 更改表达式的感知数据类型。在这里,您传递给它的是一个结果集,而不是一个表达式,而且您也没有说明要转换为什么数据类型。

    您应该能够简单地删除 TABLE 和 CAST 调用并执行以下操作:

    SELECT * FROM (SELECT * FROM tab1 INNER JOIN tab2 ON ...) INNER JOIN tab3 ON ...

    例如

    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;
    

    如果您在使这种构造起作用时遇到困难,请尝试在您的问题中添加更多细节,具体说明您尝试了什么以及遇到了什么错误。

    【讨论】:

      【解决方案2】:

      是的...我找到了答案...我太 SQL n00b 看不到它,因为它就在我面前...

      我只是在查询之外使用了“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
      

      【讨论】:

        猜你喜欢
        • 2017-08-16
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-20
        相关资源
        最近更新 更多