SQL 表表达式

引言

表表达式是一种命名的查询表达式,代表一个有效的关系表。MSSQL 支持4中类型的表表达式:派生表、公共表达式(CTE)、视图以及内联表值函数。表表达式并不是物理上真实存在的对象,它们是虚拟的。对于表表达式的查询在数据库引擎的内部都将转化为对底层对象的查询。使用表表达式的好处通常体现在代码的逻辑方面,而不是新能方面。

要有效地定义任何类型的表表达式,查询语句必须满足三个要求:不保证有一点过的顺序;所有的列必须有名称;所有的列名必须唯一。

1.派生表

派生表(也称为表子查询)是在外部查询的FROM子句中定义的。派生表存在的范围为定义它的外部查询,只要外部查询一结束,派生表也就不存在了。派生表的查询语句需要写在一对园括号内,后面跟着AS子句和派生表的名称。

比如一个简单的派生表:以下代码返回雇员ID为2的直接下属数量。

SELECT A.mgrid,NumOfSubordinate
FROM 
(
    SELECT mgrid,COUNT(*) AS NumOfSubordinate
    FROM [TSQLFundamentals2008].[HR].[Employees]
    WHERE mgrid IS NOT NULL
    GROUP BY mgrid
)AS A
WHERE A.mgrid=2

派生表存在的问题是:当多个派生表之前嵌套使用时,会增加代码的复杂性;此外,由于不能引用同一个派生表的多个实例,因而不得不维护同一个查询定义的多个副本,这让代码变得冗长。

比如重复定义同一个派生表:以下代码返回与雇员ID为2的直接下属数量相等的那些雇员ID。

SELECT B.mgrid
FROM 
(
    SELECT A.mgrid,NumOfSubordinate
    FROM 
    (
        SELECT mgrid,COUNT(*) AS NumOfSubordinate
        FROM [TSQLFundamentals2008].[HR].[Employees]
        WHERE mgrid IS NOT NULL
        GROUP BY mgrid
    )AS A
    WHERE A.mgrid=2
) AS A
JOIN
(
    SELECT mgrid,COUNT(*) AS NumOfSubordinate
    FROM [TSQLFundamentals2008].[HR].[Employees]
    WHERE mgrid IS NOT NULL
    GROUP BY mgrid
)AS B 
ON A.NumOfSubordinate=B.NumOfSubordinate AND A.mgrid<>B.mgrid

 

猜你喜欢

转载自www.cnblogs.com/datazhj/p/9116216.html