日期:2014-05-17  浏览次数:20488 次

这是不是个临时表?
请帮忙看看下面代码,
1 表O的列们都没有声明,就这样能执行,为什么?
2 执行过之后,表O是不是就被清除了?因为我重新select不到它了。
3 这个表和@表变量有何不同
谢谢
SELECT *
FROM ( VALUES
         (10003, '20090213', 4, 'B'),
         (10004, '20090214', 1, 'A'),
         (10005, '20090213', 1, 'C'),
         (10006, '20090215', 3, 'C') )
     AS O(orderid, orderdate, empid, custid);

------解决方案--------------------

SELECT *
FROM ( VALUES
         (10003, '20090213', 4, 'B'),
         (10004, '20090214', 1, 'A'),
         (10005, '20090213', 1, 'C'),
         (10006, '20090215', 3, 'C') )
     AS O(orderid, orderdate, empid, custid);

AS O (x,y,z) 这个O不是表, 只是在语句里,给 这个行集(以你的例子为例,此行集共有4条记录)一个别名。  同样的,x,y,z也只是给这些列的一个标识。


是新的语法。

本质上跟:

select * from (select 1 as id, 'aa' as name union all select 2 as id, 'bb' as name) as O
是完全一样的,是给子查询或者中间行集的一个别名。


执行过之后0自然不存在了, 他不是实表,也不是临时表,更不是表变量。


与表变量的区别,  确切来说,这个不是表,只是语句中执行出来的一个中间结果行集,为了方便在同一语句中使用给了别名而已。   它,什么也不是。