2011-03-07 110 views
1

你能使用的東西上的使用表演員

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

行要考慮到什麼是表內(CAST())是一種比簡單的選擇涉及到像測試作爲一個塊要複雜得多(選擇)選擇* ...等

我需要一個簡單的方法來做到這一點,最好不需要臨時表。

謝謝。

數據庫: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的行)

回答

4

CAST在這裏似乎完全不相關。您使用CAST來更改表達式的感知數據類型。在這裏,你傳遞給它一個結果集,而不是一個表達式,而你並沒有說要投射到什麼數據類型。

你應該能夠簡單地刪除表和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; 

如果您有困難得到那種結構的工作,嘗試將更多的細節,你的問題有關具體情況,你得到你已經嘗試過什麼,什麼錯誤。

0

啊...我找到了答案......我只是太SQL的n00b看到它,因爲它是正確的在我的面前......

我剛接過「與」語句外查詢和它的工作。

非常感謝你的幫助,這是你的答案,導致我看到我的錯誤: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