Sql 这个创建视图代码是如何工作的?

Sql 这个创建视图代码是如何工作的?,sql,sql-server,tsql,common-table-expression,Sql,Sql Server,Tsql,Common Table Expression,好的,下面是视图的示例代码。select RT.RoleID[…]的第二部分对我来说似乎很清楚。这是运行查询以使用视图时将显示的部分。但第一部分还不清楚 据我所知,前两行是标准的,然后是整个部分。有人能给我解释一下吗?从未见过选择公式之类的东西 它被调用,基本上您的视图与: CREATE VIEW vSalesStaffQuickStats AS SELECT E.EmployeeID, EmployeeOrders = OS.NumberOfOrders,

好的,下面是视图的示例代码。select RT.RoleID[…]的第二部分对我来说似乎很清楚。这是运行查询以使用视图时将显示的部分。但第一部分还不清楚

据我所知,前两行是标准的,然后是整个部分。有人能给我解释一下吗?从未见过选择公式之类的东西

它被调用,基本上您的视图与:

CREATE VIEW vSalesStaffQuickStats
AS
 SELECT E.EmployeeID, 
         EmployeeOrders = OS.NumberOfOrders, 
         EmployeeLastOrderDate = OS.MostRecentOrderDate, 
         E.ManagerID, 
         ManagerOrders = OM.NumberOfOrders, 
         ManagerLastOrderDate = OM.MostRecentOrderDate 
  FROM   HumanResources.Employee AS E 
       INNER JOIN    (
            SELECT SalesPersonID, COUNT(*) NumberOfOrders
                  , MAX(OrderDate) MostRecentOrderDate
            FROM Sales.SalesOrderHeader
            GROUP BY SalesPersonID
      ) AS OS 
         ON E.EmployeeID = OS.SalesPersonID 
       LEFT OUTER JOIN    (
            SELECT SalesPersonID, COUNT(*) NumberOfOrders
                 , MAX(OrderDate) MostRecentOrderDate
            FROM Sales.SalesOrderHeader
            GROUP BY SalesPersonID
      ) AS OM 
         ON E.ManagerID = OM.SalesPersonID 
正如您所看到的,您可以轻松地将其与子查询交换。但在你的情况下,你需要用CTE做两次,你只做一次

编辑:

更新后使用新查询:

CREATE VIEW [dbo].[sviw_System_MyPermissions_CurrentDomain]
AS  
SELECT RT.RoleID, RT.TableName, DR.Domain, RT.GrantUpdate, RT.GrantInsert, RT.GrantDelete
FROM stbl_System_RolesTables AS RT WITH (NOLOCK) 
JOIN (
    SELECT RM.Domain, RM.RoleID
    FROM stbl_System_RolesMembersDomains AS RM WITH (NOLOCK)
    WHERE RM.Domain = (SELECT CurrentDomain FROM stbl_System_Users WITH (NOLOCK) WHERE Login = SUSER_SNAME())
      AND RM.Login = SUSER_SNAME()
) AS DR ON RT.RoleID = DR.RoleID

WITH关键字只是引用了此处更详细的公共表表达式:基本上WITH语句中的所有内容都可以被视为外部化子查询,然后在主查询中使用该结果集

i、 e:

。。。上面子查询的结果集保存在名为MyDomainRoles的CTE中。然后您可以将MyDomainRoles作为表引用。使事情读起来更简单,写起来更清晰

由于此CTE非常简单,您可以轻松地按如下方式重新编写,但它看起来并不整洁:

WITH MyDomainRoles AS (

)

SELECT RT.RoleID, RT.TableName, DR.Domain, RT.GrantUpdate, RT.GrantInsert, RT.GrantDelete
  FROM stbl_System_RolesTables AS RT WITH (NOLOCK) 
    JOIN (

SELECT RM.Domain, RM.RoleID
    FROM stbl_System_RolesMembersDomains AS RM WITH (NOLOCK)
    WHERE RM.Domain = (SELECT CurrentDomain FROM stbl_System_Users WITH (NOLOCK) WHERE Login = SUSER_SNAME())
      AND RM.Login = SUSER_SNAME()

) AS DR ON RT.RoleID = DR.RoleID

我发现我从网上随机抽取了一个例子,犯了一个错误。你能用一个查询来编辑一个答案吗?我会在一个瞬间放进去,所以它就像其他语言PHP,C++中的一个函数,在我查询的时候,我可以通过插入函数名称来重用它,它看起来是类似的,但基本上是相同的想法。表演几乎总是一样的。它只是让代码更具可读性。它不是真正的“函数”,因为CTE的作用域只是下一个命令SELECT/UPDATE/DELETE。。。例如,不能将其重复用于多个选择。这类似于为SELECT操作创建一个动态虚拟表。首次编辑后,您的问题文本不再与示例代码匹配。不是要重新创建控制盘:。带有公共表表达式的CTE块类似于内联视图/子查询,它已被重构为自己的select。如果必须多次执行select以节省性能和维护时间,则通常会执行此操作。-SQL Server和Azure SQL数据库的语法创建[或更改]视图[架构名称]视图名称[列[,…n]][带[,…n]]作为select语句[带复选选项][;]:={[加密][SCHEMABINDING][查看\u元数据]}
WITH MyDomainRoles AS (

  --- sub-query Start
  SELECT RM.Domain, RM.RoleID
    FROM stbl_System_RolesMembersDomains AS RM WITH (NOLOCK)
    WHERE RM.Domain = (SELECT CurrentDomain FROM stbl_System_Users WITH (NOLOCK) WHERE Login = SUSER_SNAME())
      AND RM.Login = SUSER_SNAME()
  --- sub-query End

)
WITH MyDomainRoles AS (

)

SELECT RT.RoleID, RT.TableName, DR.Domain, RT.GrantUpdate, RT.GrantInsert, RT.GrantDelete
  FROM stbl_System_RolesTables AS RT WITH (NOLOCK) 
    JOIN (

SELECT RM.Domain, RM.RoleID
    FROM stbl_System_RolesMembersDomains AS RM WITH (NOLOCK)
    WHERE RM.Domain = (SELECT CurrentDomain FROM stbl_System_Users WITH (NOLOCK) WHERE Login = SUSER_SNAME())
      AND RM.Login = SUSER_SNAME()

) AS DR ON RT.RoleID = DR.RoleID