2010-06-30 20 views
4

我有一些結構相同的表格,我想在它們的一組中進行選擇。是否可以從多個表中進行選擇,並將其名稱作爲子查詢的結果?

而不是僅僅對所有這些表進行循環,我想在主查詢的FROM之後放置一個子查詢。

它有可能會失敗嗎?

謝謝!

(使用Oracle)


附加信息:我沒有表的名稱權了!它們存儲在另一個表中。是否有可能在我的主要查詢的FROM之後放置子查詢?

+0

存儲在模型中的數據字典信息(例如表名)的設計可能是錯誤的。無論如何,動態SQL將是唯一的出路。 – 2010-07-01 12:21:21

回答

11

「我沒有表 的姓名權了!他們存儲在另一個 表」

甲骨文不會做這樣的事情在SQL。您需要使用PL/SQL並組裝一個動態查詢。

create or replace function get_dynamic_rows 
    return sys_refcursor 
is 
    stmt varchar2(32767) := null; 
    return_value sys_refcursor; 
begin 
    for r in (select table_name from your_table) 
    loop 
     if stmt is not null then 
      stmt := stmt||' union all '; 
     end if; 
     stmt := stmt||'select * from '||r.table_name; 
    end loop; 
    open return_value for stmt; 
    return return_value; 

end; 
/

這將組裝的查詢這樣

select * from table_1 union all select * from table_2 

的UNION ALL是一組操作者,結合多個查詢的輸出在一個單一的結果,而不刪除重複設置。每個查詢中的列必須匹配數字和數據類型。

因爲生成的語句會自動執行,所以在格式化時沒有真正的值(除非查詢的實際位比較複雜,您可能需要調試它)。

Ref遊標是與JDBC或.Net ResultSets等效的PL/SQL構造。 Find out more

+0

+1你有我的投票;-) – Andomar 2010-06-30 12:18:30

+0

@JanekBogucki - 好點。謝謝。 – APC 2010-06-30 13:30:16

4

當然,只是工會在一起:

select * from TableA 
union all 
select * from TableB 
union all 
select * from TableC 

你可以在一個子查詢工會:

使用union,如果你只在唯一行感興趣,union all如果你希望所有包括重複的行。

+0

是的,但我沒有馬上就有名字! 它們存儲在另一個表中。是否有可能在我的主要查詢的FROM之後放置子查詢? – Acibi 2010-06-30 11:53:31

+1

如果表名在另一個表中,這意味着您需要執行動態SQL並且不能創建某種子查詢。最好的辦法是有兩個查詢,一個查詢表名,另一個查詢上面的聯合。 – 2010-06-30 11:57:15

相關問題