今天给大家介绍一下SQLServer中crossjoin的用法,希望对大家有所帮助!1、交叉连接的概念交叉连接是连接查询的第一阶段,对两个数据表进行笛卡尔积。即,将第一个数据表的每一行与第二个表的所有行进行join,生成的结果集大小为T1*T2。select*fromt1crossjoint22,crossjoin的语法格式select*fromt1crossjoint2;--常用select*fromt1,t2;--SQL:1989规范select*fromt1crossjoint2wheret1.col1=t2.col2;--相当于innerjoinselect*fromt1innerjoint2ont1.col1=t2.col23、交叉查询使用场景3.1cross-join可以查询所有数据--例子--employee表CREATETABLE[dbo].[EmpInfo]([empId][int]IDENTITY(1,1)NOTNULL,[empNo][varchar](20)NULL,[empName][nvarchar](20)NULL,CONSTRAINT[PK_EmpInfo]PRIMARYKEYCLUSTERED([empId]ASC)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY])ON[PRIMARY]--奖金表CREATETABLE[dbo].[SalaryInfo]([id][int]IDENTITY(1,1)NOTNULL,[empId][int]NULL,[salary][decimal](18,2)NULL,[seasons][varchar](20)NULL,CONSTRAINT[PK_SalaryInfo]PRIMARYKEYCLUSTERED([id]ASC)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY])ON[PRIMARY]--创建季度表TABLE[dbo].[Seasons]([name][nchar](10)NULL)ON[PRIMARY]GOSETIDENTITY_INSERT[dbo].[EmpInfo]ONINSERT[dbo].[EmpInfo]([empId],[empNo],[empName])VALUES(1,N'A001',N'王强')INSERT[dbo].[EmpInfo]([empId],[empNo],[empName])VALUES(2,N'A002',N'李明')INSERT[dbo].[EmpInfo]([empId],[empNo],[empName])VALUES(3,N'A003',N'张三')INSERT[dbo].[SalaryInfo]([id],[empId],[salary],[seasons])VALUES(1,1,CAST(3000.00ASDecimal(18,2)),N'第一季度')INSERT[dbo].[SalaryInfo]([id],[empId],[salary],[seasons])VALUES(2,3,CAST(5000.00ASDecimal(18,2)),N'第一季度')INSERT[dbo].[SalaryInfo]([id],[empId],[salary],[seasons])VALUES(3,1,CAST(3500.00ASDecimal(18,2)),N'secondquarter')INSERT[dbo].[SalaryInfo]([id],[empId],[salary],[seasons])VALUES(4,3,CAST(3000.00ASDecimal(18,2)),N'secondquarter')INSERT[dbo].[SalaryInfo]([id],[empId],[salary],[seasons])VALUES(5,2,CAST(4500.00ASDecimal(18,2)),N'secondquarter')INSERT[dbo].[季节]([名称])VALUES(N'第一季度')INSERT[dbo].[季节]([名称])VALUES(N'第二季度')INSERT[dbo].[季节]([名称])VALUES(N'ThirdQuarter')INSERT[dbo].[Seasons]([name])VALUES(N'FourthQuarter')--查询每个人每个季度的奖金,如果奖金不存在,则是0SELECTa.empName,b.nameseasons,isnull(c.salary,0)salaryFROMEmpInfoaCROSSJOINSeasonsbLEFTOUTERJOINSalaryInfocONa.empId=c.empIdANDb.name=c.seasons3.2交叉连接优化查询性能在某些情况下,可以使用交叉连接代替子查询,通过减少子查询带来的多表扫描,使得提高优化查询的性能4.总结Crossjoin支持使用WHERE子句过滤行,但是笛卡尔积可能会占用大量资源。如果不是真的需要笛卡尔积,则应避免使用CROSSJOIN。建议改用INNERJOIN,效率会更高。如果您需要为所有可能性返回数据,连接查询会很有用。
