假设我有两张桌子。其中一个以一对多关系引用另一个:
CREATE TABLE t (
id SERIAL PRIMARY KEY
, name text
);
INSERT INTO t (name) VALUES ('one'), ('two'), ('three');
CREATE TABLE y (
id SERIAL PRIMARY KEY
, tid INTEGER REFERENCES t
, amount INTEGER
);
INSERT INTO y (tid, amount) VALUES
(1, 1),
(1, 2),
(1, 3),
(2, 1),
(3, 1);
Run Code Online (Sandbox Code Playgroud)
我可以从这些表中查询数据,以获得与 和t上设置的特定条件匹配的行:ty
SELECT row_to_json(t.*) as "t_nogroup" FROM t
JOIN y ON t.id = y.tid
WHERE t.id = 1
AND y.amount > 1; …Run Code Online (Sandbox Code Playgroud) 我问这个问题的方式是尝试了解我遇到的类似情况,并尝试了解插入视图是如何工作的。
我有这些表:
Create table A([id] int primary key not null, value nvarchar(50) NULL)
Create table B([id] int primary key not null, value nvarchar(50) NULL)
Run Code Online (Sandbox Code Playgroud)
我从两个表创建视图,如下所示:
create View V as (select * from A) UNION ALL (select * from B)
Run Code Online (Sandbox Code Playgroud)
我在 V 视图上有这个触发器:
Create trigger v_trig on V instead of insert AS
insert into v (id,value) select id,value from inserted
Run Code Online (Sandbox Code Playgroud)
当我尝试插入到我的视图中时,出现以下错误:
消息 4436,级别 16,状态 12,过程 v_trig,第 2 行
UNION ALL 视图“db.dbo.V”不可更新,因为未找到分区列
我有一个具有类似视图(带有union all)的数据库,出于某种原因,我可以毫无问题地插入它,我试图理解为什么。
我应该怎么做才能允许插入到诸如视图之类的视图中?有没有办法以插入的方式决定(不更改触发器)哪个是视图的默认表?
我必须处理第三方数据库,我试图获取视图中使用的所有列,但我对它们进行了加密,
例如:而不是获取int我NUMERO_SALARIE知道TNumSal为什么?
DECLARE @TableViewName NVARCHAR(128)
SET @TableViewName=N'DP_SALARIE'
SELECT b.name AS ColumnName, c.name AS DataType, b.max_length AS Length
FROM sys.all_objects a
INNER JOIN sys.all_columns b
ON a.object_id=b.object_id
INNER JOIN sys.types c
ON b.user_type_id=c.user_type_id
WHERE a.Name=@TableViewName
AND a.type IN ('U','V')
Run Code Online (Sandbox Code Playgroud)
有什么办法可以解密它们吗?
今天早些时候,我意识到我犯了一个非常愚蠢的错误。我没有编写视图,而是编写了无参数内联表值函数。这让我思考:除了界面之外,两者之间有什么区别吗?据我所知,它们在逻辑上是相同的并且执行相同。
那么,换句话来说,视图提供了哪些无参数内联表值函数所没有的功能呢?我想到的只是索引视图,但我从未见过有人真正使用它们。
我需要访问 user_mviews 或 all_mviews 表以获取有关我的应用程序中物化视图的元信息。读取 user_mviews 表需要哪些授权?
我在一堂 SQL 课上,讲师说“DBA 不喜欢用户创建视图,因为他们会破坏表空间”。
显然,我知道任何模式对象都会消耗一些表空间,但是说视图会占用表空间并不是夸大其词,因为您需要存储的只是一个查询(以及权限和一些其他元数据),并且因此,它们不会比普通表中的普通行占用更多的空间?
如果我加入两个/更多复杂的视图(通过加入两个/更多表组成的视图);它会导致对基表的多次读取迭代吗?
仅在基表本身上设置连接条件不是更有效吗?
这是我在我们的生产 Oracle 10g R2(ASM 磁盘组)环境中分析过的一个问题,sql 查询是由应用程序本身动态生成的,而不是使用表来提取结果,而是使用复合视图。
此外,条件连接经常在这些复合视图上实现。
复杂视图上的这种连接是否会不必要地导致高 CPU 利用率并占用宝贵的缓冲区缓存?
使用 SQL 2005 或 2008,是否可以创建一个名为 C 的数据库,它是数据库 A + B 中所有表的视图?数据库 A、B 和 C 位于同一本地服务器上。
我希望能够在 2 个不同数据库中的表之间创建连接查询。有没有另一种方法可以做到这一点?
使用 PostgreSQL 9.1,我们在 PostgreSQL 的 VIEW 上执行查询时遇到问题。以下是情况:
我们有一个分区表“buz_scdr”,我们在它上面构建了一个视图“Swiss_client_wise_minutes_and_profit”。此 VIEW 的目的是连接来自不同表(包括“buz_scdr”表)的数据以进行高效查询。这个策略一直运行良好,直到表“buz_scdr”变得巨大(所有分区中的整体记录变得巨大。该表基于日期进行分区)。
在此 VIEW 上执行的查询开始需要很长时间(大约 5 到 10 分钟)。为了弄清楚为什么这个查询需要这么长时间才能执行,我们使用 EXPLAIN 命令来显示它的执行计划。我们使用的查询如下:
EXPLAIN SELECT * from "Swiss_client_wise_minutes_and_profit" where start_time = '2012-7-22 08:00';
Run Code Online (Sandbox Code Playgroud)
其结果在explain.depesz.com 上或如下:
Subquery Scan on "Swiss_client_wise_minutes_and_profit" (cost=2127919.71..94874537.55 rows=40474 width=677)
Filter: ("Swiss_client_wise_minutes_and_profit".start_time = '2012-07-22 08:00:00+00'::timestamp with time zone)
-> WindowAgg (cost=2127919.71..94773352.06 rows=8094839 width=148)
-> Sort (cost=2127919.71..2148156.81 rows=8094839 width=148)
Sort Key: cc.name, rdga.group_id
-> Hash Left Join (cost=1661.50..604234.77 rows=8094839 width=148)
Hash Cond: (((cc.company_id)::text = (rdga.company_id)::text) AND ((cs.c_prefix_id)::text = (rdga.dest_id)::text))
-> Hash …Run Code Online (Sandbox Code Playgroud) postgresql performance view partitioning subquery query-performance
我为许多客户提供了一个数据库系统。该数据库本地安装在 Oracle 上。
随着产品的增长,我们会定期升级数据库结构(添加新字段、重命名旧字段、更改内容)。
我的一位客户希望将他们自己的自定义视图添加到数据库中。他们向我保证,他们会将视图添加到实时模式的不同模式中。但是,我担心包含视图可能会影响未来的升级脚本。
如果视图引用了要更改的表,视图的存在是否会阻止表被更改?
view ×10
oracle ×4
sql-server ×4
postgresql ×2
alter-table ×1
datatypes ×1
functions ×1
partitioning ×1
performance ×1
subquery ×1
t-sql ×1
tablespaces ×1
upgrade ×1