我用4个表创建了一个MySQL视图.是否可以将数据插入视图并让MySQL自动将数据传递到正确的表中?
我正在尝试将低性能MERGE
语句重构为UPDATE
Oracle 12.1.0.2.0中的语句.该MERGE
声明是这样的:
MERGE INTO t
USING (
SELECT t.rowid rid, u.account_no_new
FROM t, u, v
WHERE t.account_no = u.account_no_old
AND t.contract_id = v.contract_id
AND v.tenant_id = u.tenant_id
) s
ON (t.rowid = s.rid)
WHEN MATCHED THEN UPDATE SET t.account_no = s.account_no_new
Run Code Online (Sandbox Code Playgroud)
它大多是低性能的,因为对大型(100M行)表有两个昂贵的访问 t
这些是涉及的简化表:
t
account_no
正在迁移其列的目标表.u
迁移指令表包含account_no_old
→ account_no_new
映射v
建模contract_id
和之间的一对一关系的辅助表tenant_id
架构是:
CREATE TABLE v (
contract_id NUMBER(18) NOT NULL PRIMARY KEY,
tenant_id NUMBER(18) NOT …
Run Code Online (Sandbox Code Playgroud) 如何在TSQL中创建可更新的视图.请提供简单的示例,我可以根据我的解决方案.
最近我用TSQL帮助了我的朋友,他向我询问了可更新的视图.我认为将我的解决方案留在这里作为快速查找将是一个好主意.
如需参考,请查看msdn.
我正在使用MSSQL 2008 R2.它具有可更新视图的便利功能.例如,如果我有一个表t映射id到name:
create table t (id int not null primary key, name varchar(100) not null unique)
Run Code Online (Sandbox Code Playgroud)
然后另一个表提供一些ID和更多信息:
create table u (id int not null primary key references t, info varchar(100) not null)
Run Code Online (Sandbox Code Playgroud)
为了方便起见,这个视图让我可以看到来自u的行,并使用name列进行扩充:
create view v as select u.*, t.name from u u join t t on u.id = t.id
Run Code Online (Sandbox Code Playgroud)
那么我现在可以按名称进行更新,而不是id:
update v set info = 'foo' where name = 'fred'
Run Code Online (Sandbox Code Playgroud)
最方便的.但是,如果我想删除'fred'的行,会发生什么?
delete v where name = 'fred' -- Fails
Run Code Online (Sandbox Code Playgroud)
我收到了错误
视图或函数"v"不可更新,因为修改会影响多个基表.
正如SQL Updatable View中所解释的那样,连接表(指的是Oracle,但MSSQL的情况看起来相同),只要只有一个 …
我为一组三个表创建了一个自定义视图.如何配置视图以便应用程序可以像使用表一样编辑它?我正在使用SQL Server Studio Express.
我知道这有点模糊,但我对观点不熟悉,并试图了解他们的能力.
假设我使用表的组合创建由复杂查询创建的视图.如果我试图在视图中编辑一条记录,那么视图是否足够智能,可以向后通过创建视图的逻辑并在正确的表中编辑正确的值?
是否在视图中编辑了一个值?
谢谢!