SQL Server中交叉聯(lián)接的用法詳解

今天給大家介紹SQLServer中交叉聯(lián)接的用法,希望對大家能有所幫助!
1、交叉聯(lián)接(cross join)的概念
交叉聯(lián)接是聯(lián)接查詢的第一個階段,它對兩個數(shù)據(jù)表進行笛卡爾積。即第一張數(shù)據(jù)表每一行與第二張表的所有行進行聯(lián)接,生成結(jié)果集的大小等于T1*T2。
select * from t1 cross join t2
2、交叉聯(lián)接的語法格式

select * from t1 cross join t2;--常用寫法 select * from t1, t2;-- SQL:1989的規(guī)范 select * from t1 cross join t2 where t1.col1=t2.col2;--等價于內(nèi)部聯(lián)接 select * from t1 inner join t2 on t1.col1=t2.col2
3、交叉查詢的使用場景
3.1 交叉聯(lián)接可以查詢?nèi)繑?shù)據(jù)
-- 示例
-- 員工表 CREATE TABLE [dbo].[EmpInfo]( [empId] [int] IDENTITY(1,1) NOT NULL, [empNo] [varchar](20) NULL, [empName] [nvarchar](20) NULL, CONSTRAINT [PK_EmpInfo] PRIMARY KEY CLUSTERED ( [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] -- 獎金表 CREATE TABLE [dbo].[SalaryInfo]( [id] [int] IDENTITY(1,1) NOT NULL, [empId] [int] NULL, [salary] [decimal](18, 2) NULL, [seasons] [varchar](20) NULL, CONSTRAINT [PK_SalaryInfo] PRIMARY KEY CLUSTERED ( [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] -- 季度表 CREATE TABLE [dbo].[Seasons]( [name] [nchar](10) NULL ) ON [PRIMARY] GO SET IDENTITY_INSERT [dbo].[EmpInfo] ON INSERT [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.00 AS Decimal(18, 2)), N'第一季度') INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons]) VALUES (2, 3, CAST(5000.00 AS Decimal(18, 2)), N'第一季度') INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons]) VALUES (3, 1, CAST(3500.00 AS Decimal(18, 2)), N'第二季度') INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons]) VALUES (4, 3, CAST(3000.00 AS Decimal(18, 2)), N'第二季度 ') INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons]) VALUES (5, 2, CAST(4500.00 AS Decimal(18, 2)), N'第二季度') INSERT [dbo].[Seasons] ([name]) VALUES (N'第一季度') INSERT [dbo].[Seasons] ([name]) VALUES (N'第二季度') INSERT [dbo].[Seasons] ([name]) VALUES (N'第三季度') INSERT [dbo].[Seasons] ([name]) VALUES (N'第四季度') -- 查詢每個人每個季度的獎金情況 如果獎金不存在則為0 SELECT a.empName,b.name seasons ,isnull(c.salary,0) salary FROM EmpInfo a CROSS JOIN Seasons b LEFT OUTER JOIN SalaryInfo c ON a.empId=c.empId AND b.name=c.seasons
3.2 交叉聯(lián)接優(yōu)化查詢性能
針對一些情況可以采用交叉聯(lián)接的方式替代子查詢,通過減少子查詢造成的多次表掃描,從而可以提高優(yōu)化查詢的性能。
4、總結(jié)
交叉聯(lián)接雖然支持使用WHERE子句篩選行,由于笛卡兒積占用的資源可能會很多,如果不是真正需要笛卡兒積的情況下,則應(yīng)當避免地使用CROSS JOIN。建議使用INNER JOIN代替,效率會更高一些。如果需要為所有的可能性都返回數(shù)據(jù)聯(lián)接查詢可能會非常實用。
到此這篇關(guān)于SQL Server中交叉聯(lián)接的用法介紹的文章就介紹到這了,更多相關(guān)SQL Server交叉聯(lián)接內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信