2013-03-25 53 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作为数据库的一部分,使用正确的数据类型但没有约束(当你只填充一些列而不是全部时,这些可能会进入) - 然后每个事务只能看到它自己的表和数据版本...