刚刚发现sql05还有使用虚拟表的功能,因从没用过,所以对这个东东很不熟悉,也不清楚虚拟表到底有什么优点,懂的的朋友麻烦解释下吧,谢谢~

解决方案 »

  1.   

    declare @t table(col...)表变量,与其他变量一样。
      

  2.   

    你说的虚拟表指的是表变量还是CTE??
      

  3.   

    CTE的话参考通用表表达式 Common Table Expressions  通用表表达式(CTE)是一个可以由定义语句引用的临时表命名的结果集。在他们的简单形式中,您可以将CTE视为类似于视图和派生表混合功能的改进版本。在查询的FROM子句中引用CTE的方式类似于引用派生表和视图的方式。只须定义CTE一次,即可在查询中多次引用它。在CTE的定义中,可以引用 在同一批处理中定义的变量。但是CTE的真正威力在于它们的递归功能,即CTE可以包含对它们自身的引用。视图、派生表和CTE内部的查询的一般形式1、视图
    CREATE VIEW <view_name>(<column_aliases>) AS <view_query>2、派生表
    SELECT * FROM (<derived_table)query>) AS <dericed_table_alias>(<column_aliases>)3、CTE
    WITH <cte_alias>(<column_aliases>)
    AS
    {
     <cte_query>
    )
    SELECT * FROM <cte_alias]>
    在关键字WITH之后,为CTE提供一个别名,并且为它的结果列提供一个可选的别名列表;编写CTE的主体;然后从外部查询中引用它。4、演示代码
    USE AdventureWorks
    GO
    WITH SalesCTE(ProductID, SalesOrderID)
    AS 
    (
     SELECT ProductID, COUNT(SalesOrderID) 
     FROM Sales.SalesOrderDetail 
     GROUP BY ProductID
    )
    SELECT * FROM SalesCTERecursive CTEs 递归的通用表表达式递归的CTE是根据至少两个查询(或者称为两个成员)构建的,一个是非递归查询,也成为固定成员,只能调用一次,另外一个是递归查询,也成为递归成员(RM),可以反复调用,直到查询不再返回行。查询由UNION ALL运算符连接为一个单独的CTE。--使用递归的通用表表达式
    USE demo
    GO
    CREATE TABLE CarParts
    (
     CarID INT NOT NULL,
     Part VARCHAR(15),
     SubPart VARCHAR(15),
     Qty INT
    )
    GO
    INSERT CarParts VALUES (1, 'Body', 'Door', 4)
    INSERT CarParts VALUES (1, 'Body', 'Trunk Lid', 1)
    INSERT CarParts VALUES (1, 'Body', 'Car Hood', 1)
    INSERT CarParts VALUES (1, 'Door', 'Handle', 1)
    INSERT CarParts VALUES (1, 'Door', 'Lock', 1)
    INSERT CarParts VALUES (1, 'Door', 'Window', 1)
    INSERT CarParts VALUES (1, 'Body', 'Rivets', 1000)
    INSERT CarParts VALUES (1, 'Door', 'Rivets', 100)
    INSERT CarParts VALUES (1, 'Door', 'Mirror', 1)
    GO
    SELECT * FROM CarParts
    GOWITH CarPartsCTE(SubPart, Qty) 
    AS
    (
     -- 固定成员 (AM):
     -- SELECT查询无需参考CarPartsCTE
     SELECT SubPart, Qty
     FROM CarParts
     WHERE Part = 'Body'
     UNION ALL
     -- 递归成员 (RM):
     -- SELECT查询参考CarPartsCTE
     SELECT CarParts.SubPart, CarPartsCTE.Qty * CarParts.Qty
     FROM CarPartsCTE 
     INNER JOIN CarParts ON CarPartsCTE.SubPart = CarParts.Part
     WHERE CarParts.CarID = 1
    )
    -- 外部查询
    SELECT SubPart, SUM(Qty) AS TotalNUM
    FROM CarPartsCTE
    GROUP BY SubPart   
      

  4.   

    我从朋友那里拿了个项目,上面有些查询的语句,我按照上面的查询语句去找相关的表,结果没找到,问了下,说是用的虚拟表,比如这个查询语句:select top " + size + " ID,ProName,ProPrice,ProImgUrl from Shop_Product where ProHotFlag=" + sta.ToString() + " and Delflag=1 order by OrderBy desc,然后我在数据库没找到Shop_Product 这个表
      

  5.   

    看看是不是试图,或者使用命令exec SP_HELP 'Shop_Product'