我正在寻找一种方法来模拟来自SP的Firebird中的“create table as select”。
我们经常在另一个产品中使用此语句,因为它很容易制作较小的可索引集,并在服务器端提供非常快速的结果。
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))
“create table as select”非常好,因为它提供了正确的字段类型和名称,所以我不需要预先定义它们。
我可以使用Delphi在Firebird中模拟“create table as”:
选择没有行的select,获取表字段类型,将它们转换为create table SQL,运行它,并使“insert into temp table”+ chooseql with rows(without order by)。 没关系。
但是我可以在一个获取select sql的公共存储过程中创建相同的东西,并创建一个带有结果的新临时表吗?
所以:我可以获取查询结果的字段类型,我可以从中创建字段创建者SQL吗?
我只是问是否有办法(然后我必须指定列)。
答案 0 :(得分:2)
Firebird不支持在存储过程中执行DDL。您可以使用EXECUTE STATEMENT执行此操作,但不建议这样做(请参阅“No data returned”主题末尾的警告)。
使用(事务级别)Global Temporary Table的一种方法是使用“临时集”。创建GTT作为数据库的一部分,具有正确的数据类型但没有约束(当你只填充一些列而不是所有列时,这些可能会进入) - 然后每个事务只看到它自己的表和数据版本...... < / p>