時間:2021-04-22來源:www.farandoo.com作者:電腦系統城
今天給大家介紹SQLServer中交叉聯接的用法,希望對大家能有所幫助!
交叉聯接是聯接查詢的第一個階段,它對兩個數據表進行笛卡爾積。即第一張數據表每一行與第二張表的所有行進行聯接,生成結果集的大小等于T1*T2。
1 | select * from t1 cross join t2 |
1 2 3 4 5 |
select * from t1 cross join t2; --常用寫法 select * from t1, t2; -- SQL:1989的規范 select * from t1 cross join t2 where t1.col1=t2.col2; --等價于內部聯接 select * from t1 inner join t2 on t1.col1=t2.col2 |
-- 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
-- 員工表 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 |
針對一些情況可以采用交叉聯接的方式替代子查詢,通過減少子查詢造成的多次表掃描,從而可以提高優化查詢的性能。
交叉聯接雖然支持使用WHERE子句篩選行,由于笛卡兒積占用的資源可能會很多,如果不是真正需要笛卡兒積的情況下,則應當避免地使用CROSS JOIN。建議使用INNER JOIN代替,效率會更高一些。如果需要為所有的可能性都返回數據聯接查詢可能會非常實用。
2022-03-09
sql語句中union的用法與踩坑記錄2022-03-05
MSSQL 附加數據庫提示“錯誤 823”數據恢復實操2022-03-05
sqlserver數據庫加密后無法使用MDF,LDF,log文件名稱被修改的數據恢復