FoxPro:将任意数量的视图追加到单个视图或表中

时间:2018-06-19 22:18:33

标签: sql visual-foxpro foxpro

我有几个视图需要合并到一个视图或表中。所有视图均具有相同的结构,并分别命名为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

我错过了一些简单的东西吗?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

不幸的是,您不能像表那样真正地对待视图-它们只是存储的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

答案 1 :(得分:0)

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

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

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