SQLServer中交叉聯接的用法介紹

SQLServer中交叉聯接的用法介紹

今天給大家介紹SQLServer中交叉聯接的用法,希望對大家能有所幫助!

1、交叉聯接(cross join)的概念

交叉聯接是聯接查詢的第一個階段,它對兩個資料表進行笛卡爾積。即第一張資料表每一行與第二張表的所有行進行聯接,生成結果集的大小等於T1*T2。

select * from t1 cross join t2

2、交叉聯接的語法格式

select * from t1 cross join t2;——常用寫法select * from t1, t2;—— SQL:1989的規範select * from t1 cross join t2where t1。col1=t2。col2;——等價於內部聯接select * from t1 inner join t2 on t1。col1=t2。col2

3、交叉查詢的使用場景

3。1 交叉聯接可以查詢全部資料

—— 示例

—— 員工表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]GOSET 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‘第四季度’)—— 查詢每個人每個季度的獎金情況 如果獎金不存在則為0SELECT a。empName,b。name seasons ,isnull(c。salary,0) salary FROM EmpInfo a CROSS JOIN Seasons bLEFT OUTER JOIN SalaryInfo c ON a。empId=c。empId AND b。name=c。seasons

3。2 交叉聯接最佳化查詢效能

針對一些情況可以採用交叉聯接的方式替代子查詢,透過減少子查詢造成的多次表掃描,從而可以提高最佳化查詢的效能。

4、總結

交叉聯接雖然支援使用WHERE子句篩選行,由於笛卡兒積佔用的資源可能會很多,如果不是真正需要笛卡兒積的情況下,則應當避免地使用CROSS JOIN。建議使用INNER JOIN代替,效率會更高一些。如果需要為所有的可能性都返回資料聯接查詢可能會非常實用。