我有几个视图需要合并到一个视图或表中。所有视图均具有相同的结构,并分别命名为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
我错过了一些简单的东西吗?或者有更好的方法吗?
答案 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
请记住,游标和视图(也是一个游标)都没有持久索引,并且视图游标已缓冲。您将根据需要创建索引。
请三思,为什么需要一个视图(或任何视图)。