我做了很多研究,并试图弄清楚如何做到这一点,但建议的一切似乎并不适合我。我使用以下SQL创建表:
CREATE VIEW view_name AS SELECT * FROM table1_name
当我执行此操作时,如果我对table1_name
进行更改,则这些更改会反映在视图中(如我所愿)。但是,我稍后创建了一个表table2_name
,并希望以相同的方式将其添加到此视图中,这样,如果我向表中添加行,它们将反映在视图中。所以,我使用了类似的代码,(但是使用insert代替)
INSERT INTO view_name SELECT * FROM table2_name
但是,现在当我添加table2_name
时,这些都没有反映在视图中。我是SQL的新手(三天前开始),所以我应该非常感激任何想法或地方。
(注意:我使用的是SQL Server,我似乎并不认为这会产生很大的不同,但是如果有的话)
谢谢, SaxyTimmy
答案 0 :(得分:6)
也许你打算做什么(假设列是相同的):
ALTER VIEW view_name
AS
SELECT col1, col2 FROM table1_name
UNION ALL
SELECT col1, col2 FROM table2_name
正如Joe指出的那样,你不会在视图中插入数据 - 它不会被持久存在(除非它被编入索引,在这种情况下你也不会实际插入到视图中)。
如果要更新新表的视图,可以执行以下操作。我假设您使用的是SQL Server 2005或更高版本 - 如果您的学校正在教您SQL Server 2000,请对它们感到羞耻。我还假设了其他一些事情......你的观点不包含一个尾随语句终止符(大约是我唯一一次主张将其删除)并且你之前没有评论中的各种废话CREATE VIEW命令。
CREATE PROCEDURE dbo.AddTableToView
@view SYSNAME,
@new_table SYSNAME
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SELECT @sql = [definition] FROM sys.sql_modules
WHERE [object_id] = OBJECT_ID(@view);
SELECT @sql = STUFF(@sql, CHARINDEX('CREATE VIEW', @sql), 6, 'ALTER')
+ 'UNION ALL
SELECT col1, col2 FROM ' + @new_table;
EXEC sp_executeSQL @sql;
END
GO
但正如我在评论中所说,这真的不是你想去的方式,我怀疑你的教授会有同样的感受。
答案 1 :(得分:3)
您无法以您认为可以的方式将数据插入视图中。运行insert语句时,实际上是将数据插入到视图引用的基表(table1_name
)中。您没有在视图和table2_name
的行之间创建某种链接。
答案 2 :(得分:3)
我认为你误解了视图究竟是什么。视图基本上只是一个存储的查询。您实际上并未将行插入视图中。虽然您可以拥有可更新的视图,但它会将行插入基础表中。
如果要将table2_name
添加到视图,则需要更改该视图定义。如果列与table1_name
完全匹配,那么您可以执行以下操作:
ALTER VIEW view_name
AS
SELECT
*
FROM
table1_name
UNION ALL
SELECT
*
FROM
table2_name
或者,您可以使用新定义DROP
和CREATE
视图,而不是使用ALTER
语法。
另外,当你说“如果我对table1_name进行更改”时,你的意思是插入行还是添加列?
答案 3 :(得分:2)
您无法将数据插入视图中。您的插入将数据插入table1_name
表。 (见Updatable and Insertable Views)
如果您需要来自table1_name
和table2_name
的数据,那么您必须在table1_name
中同时拥有table2_name
和select
,视图是创建
您可以使用 UNION
*(如果您查询的两个表都具有相同的no / type / set列):
CREATE VIEW view_name AS
SELECT * FROM table1_name
UNION
SELECT * FROM table2_name
这要求table1_name
和table2_name
具有相同顺序的相同数量和类型的列
或您可以与其他表联接并获取所有列(或其中的一部分):
CREATE VIEW view_name AS
SELECT *
FROM table1_name join table2_name on some_column
* UNION
删除两个选择查询之间的重复项。如果您确定两个表中的数据是互斥的,或者您对重复行没问题,则UNION ALL
是更好的选择。 UNION ALL
效果更好。