说到联接与集合操作,其实它们就是对表的2种形式的操作。前者是表之间的水平操作,后者是表之间的垂直操作。
1.联接
联接分为2个时期.旧语法中,FROM子句后面表之间用逗号分开,没有JOIN ON 关键字.新语法才加入了JOIN关键字和ON子句.还引入了外部联接.
旧的语法也是支持外部联接的,不过形式有所不同。以前关于外部联接的语法是 *=和=*(左右联接),不推荐.
关于这方面的知识,可以参考JJ大大有篇写得很好的文章(http://blog.csdn.net/jinjazz/archive/2009/08/10/4430354.aspx)
CROSS:
交叉连接可以用于对某个的表每条记录生产一定数量的副本.
举个例子: Customers 表 表示消费信息,Employees 表示员工信息 ,我现在要为消费者和员工的每个组合生成一个指定日期内每天的订单表
DECLARE @fromdate AS DATETIME, @todate AS DATETIME;
SET @fromdate = '20060101';
SET @todate = '20060131';
----2000
SELECT IDENTITY(int, 1, 1) AS OrderID,
CustomerID, EmployeeID,
DATEADD(day, n-1, @fromdate) AS OrderDate
INTO dbo.MyOrders
FROM dbo.Customers, dbo.Employees, dbo.Nums
WHERE n <= DATEDIFF(day, @fromdate, @todate) + 1;
select * from dbo.MyOrders
--2005
WITH Orders
AS
(
SELECT CustomerID, EmployeeID,
DATEADD(day, n-1, @fromdate) AS OrderDate
FROM dbo.Customers, dbo.Employees, dbo.Nums
WHERE n <= DATEDIFF(day, @fromdate, @todate) + 1
)
SELECT ROW_NUMBER() OVER(ORDER BY OrderDate) AS OrderID,
CustomerID, EmployeeID, OrderDate
FROM Orders;
利用Cross 可以提高行与聚合函数计算的效率
--计算表里的每行值 占总和的百分比以及与平均值的差值
create table #(a int)
insert # select 1
union all select 2
union all select 5
union all