FoxPro:将任意数量的视图附加到单个视图或 table

FoxPro: Append arbitrary number of views into a single view or table

我有几个视图需要合并成一个视图或 table。所有视图都具有相同的结构,标题为 view_1, ..., view_x.

我在以下方面运气最好。我可以获得数据库中的总视图数,因此为了简单起见,我在这里使用了 12。该代码创建了一个名为 test 的新视图,并按预期使用 view_1 的内容填充它。执行时不会抛出任何错误。在状态栏中,我看到它已经处理了XXXX条记录。这对应于最后一个视图 (view_12)。但是,test只包含了view_1.

的内容
create sql view test as;
select * ;
from view_1 

for i = 2 to 12
    insert into test ;
    select * ;
    from view_&i. 
endfor

我是不是遗漏了一些简单的东西,或者有更好的方法吗?

不幸的是,您不能真正像对待表一样对待视图 - 它们只是存储的 SQL 语句。因此,要使用其他视图的结果创建新视图,您基本上需要基于其他视图的 SQL 语句构建新的 SQL 语句。

请注意,这假定每个较小视图的架构都相同,如您所说:

Close All
Clear All
Clear

Open Database mydatabase Excl

lnViews = Adbobjects(laViews, "VIEW")

If Ascan(laViews, "vcombined") > 0
    Delete View vcombined
Endif

lcSQL = ""

* -- You'll probably find out the view count and put it here.
For lnView = 1 to 3

    lcView = "view_" + Transform(lnView)
    lcSQL = lcSQL + Iif(lnView > 1, "union ", "") + DBGetProp(lcView, "View", "SQL")

Endfor  

Create SQL View vcombined as &lcSQL

VFP 视图只是一个 SQL 定义 + 一些保存在 DBC 中的属性。您可以简单地使用 "union ALL" 将具有相同结构的多个视图组合成一个新视图。但是,将其作为单一视图不太现实,因为使其可更新没有意义。

使用这些视图创建新视图确实没有多大意义。相反,您可以直接使用一个视图的 SQL 定义来创建最终视图。即:如果您的视图定义是:

select CustomerId, CustomerName from Customers1
select CustomerId, CustomerName from Customers2
*...
select CustomerId, CustomerName from CustomersN

那么您可以简单地将新定义定义为:

create sql view vMultiple as ; 
select CustomerId, CustomerName from Customers1 ;
union all ;
select CustomerId, CustomerName from Customers2 ;
union all ;
* ... ;
select CustomerId, CustomerName from CustomersN

要为此添加一些间接可更新性,您可能需要为源添加一列,例如:

create sql view vMultiple as ;
select 1 as Source, CustomerId, CustomerName from Customers1 ;
union all ;
select 2 as Source, CustomerId, CustomerName from Customers2 ;
union all ;
* ...   ;
select N as Source, CustomerId, CustomerName from CustomersN

由于创建这样的视图没有多大意义,您可能希望在需要时将其创建为游标:

select 1 as Source, CustomerId, CustomerName from Customers1 ;
union all ;
select 2 as Source, CustomerId, CustomerName from Customers2 ;
union all ;
* ...   ;
select N as Source, CustomerId, CustomerName from CustomersN ;
into cursor crsMultiple ;
nofilter   && or readwrite if it needs any updating

请记住,游标和视图(也是游标)都没有持久索引,并且视图游标是缓冲的。您可以根据需要创建索引。

三思,为什么你需要一个视图(或任何视图)。