我有一个视图,其中涉及 20 多个表上的 LEFT JOINS 到基表,但是在查询此视图并查看执行计划时,我得到了完全出乎意料的结果。
例如,对于下面的查询,我希望在表上进行聚集索引查找:
SELECT id FROM dbo.TableName WHERE id = 256
Run Code Online (Sandbox Code Playgroud)
而当我使用视图时,我会在表上找到聚集索引以及 3 个嵌套循环(左外连接)。
SELECT id FROM dbo.ViewName WHERE id = 256
Run Code Online (Sandbox Code Playgroud)
为什么会出现这种情况?上面是一个非常简单的例子,但是当从视图中选择额外的列时,越来越多的不必要的 LEFT JOINS 出现在执行计划中。
我来自 Oracle 背景,遇到了创建 SQL Server 视图的代码,这是我以前从未见过的。
我们有一个名为 viewA 的视图(例如)
在生成视图的脚本中,我看到了这段代码
select columnA, columnB, columnC
from tableA as vw_tableB
Run Code Online (Sandbox Code Playgroud)
我的问题是,视图到底叫什么?
是viewA还是vw_tableB。
我的另一个问题是这背后的基本原理是什么?
我有一个数据库: DB 1
在另一个数据库中DB 2,我想创建一堆引用DB 1. 这些视图会相对复杂,有很多连接、聚合、子查询等。
我不希望 的用户DB 2能够修改DB 1. 即我不希望用户能够在视图上执行插入、更新、删除查询。
这篇博文:http : //sqlhint.com/sqlserver/views/creating-readonly-views
建议我可以使用INSTEAD子句。除了特定用户之外,我更愿意仅禁止视图本身的某些查询子句。这可能吗?
我已经成功地在 SQL Server 中创建了一个 VIEW,如下所示。但是当我在 MySql 中尝试相同时,错误来了。
CREATE VIEW [dbo].[vw_PurchParent] as
WITH cte AS
(
SELECT a._Id, a._parentId, a._name, a._IsLedger
FROM tbl_ChartOfAcc a
WHERE _Id = 1
UNION ALL
SELECT a._Id, a._parentid, a._Name, a._IsLedger
FROM tbl_ChartOfAcc a JOIN cte c ON a._parentId = c._id
)
SELECT *
FROM cte where _IsLedger = 'Y'
GO
Run Code Online (Sandbox Code Playgroud)
MySQL 中的错误:
1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的 'cte AS( SELECT a._Id, a._parentId, a._name, ' 附近使用的正确语法
服务器版本:5.6.41 -84.1 - Percona …
SQL Server 能够创建错误的同义词。例如:
create synonym Sample for NonExistingObject
Run Code Online (Sandbox Code Playgroud)
这实际上创建了Sample同义词。
此外,还可以创建一个有效的视图,然后更改该视图所依赖的基础表,使该视图不再起作用。
我正在创建一个实用程序来自动执行与数据库以及许多模块和许多客户相关的一些任务。
我面临的一个问题是某些视图依赖于稍后添加的不存在的对象。
我想知道是否可以为create view语句提供一个标志来强制 SQL Server 不验证视图的定义而只构建它?
我有三张表:
product(pid,name,category,maker-cid)
purchase(buyer-ssn,seller-ssn,quantity,pid)
person(ssn,name,phone number,city)
Run Code Online (Sandbox Code Playgroud)
如何创建视图以仅显示所有交易中的买方名称、卖方名称和产品名称?
我需要从不同服务器但相同域上的另一个 SQL Server 查询表,但我不确定如何才能做到这一点。
我尝试了这个答案中的解决方案,但它对我不起作用,因为我得到了 SQL Server 2000(请不要讨厌 :-))。
当我尝试给出的解决方案时,我收到此错误:
第 23 行:“-”附近的语法不正确。
这是因为命令与 SQL Server 2000 不兼容。
编辑
SELECT * FROM AnotherServer.AnotherServerDatabase.Server.Table1
Run Code Online (Sandbox Code Playgroud)