2013-03-25 51 views
1

我正在尋找一種方法來模擬SP中Firebird中的「create table as select」。Firebird:模擬創建表爲?

我們經常使用的另一種產品這一說法,因爲它很容易使較小的,可轉位套,並提供在服務器端非常快的結果。

create temp table a select * from xxx where ... 
create indexes on a ... 
create temp table b select * from xxx where ... 
create indexes on b ... 

select * from a 
union 
select * from b 

或者避免子查詢中的三個或更多級別。

select * 
from a where id in (select id 
        from b 
        where ... and id in (select id from c where)) 

的「創建表的選擇」非常好COS它提供正確的字段類型和名稱,以便我不需要預先定義它們。

我可以模擬「創建表爲」火鳥用Delphi爲:

湊合着沒有行選擇,得到表字段類型,將它們轉換爲創建表的SQL,運行它,並作出「插入溫度表「+ selectql與行(不排序)。 沒關係。

但我可以在一個共同的存儲過程,而得到一個選擇SQL,並用結果創建一個新的臨時表中創建同樣的事情?

所以:我可以得到查詢結果的字段類型,我可以從他們創造領域的創造者SQL?

如果我只是問有沒有辦法與否(當時我必須指定列)。

+0

您可以使用'select * from rdb $ relation_fields'來獲得列定義,其中rdb $ relation_name ='A''然後從那裏繼續。 – 2013-03-25 08:18:18

+0

但我可以用連接字段(從....選擇a.x,b.y)做什麼? :-( – durumdara 2013-03-25 08:31:44

+0

又是怎麼回事使用創建視圖.....作爲選擇? – pf1957 2013-03-25 08:40:48

回答

2

Firebird不支持在存儲過程中執行DDL。您可以使用EXECUTE STATEMENT來完成,但不推薦使用(請參閱「No data returned」主題末尾的警告)。

一種方法做有你的「臨時集合」是使用(事務級)Global Temporary Table。創建GTT作爲數據庫的一部分,使用正確的數據類型但沒有約束(當你只填充一些列而不是全部時,這些可能會進入) - 然後每個事務只能看到它自己的表和數據版本...