亚洲精品中文字幕无码专区一,中文字幕av一区乱码深夜动态福利,粗大的内捧猛烈进出少妇

          系統城裝機大師 - 唯一官網:www.snowmanhill.com!

          當前位置:首頁 > 數據庫 > MsSql > 詳細頁面

          SQL Server中交叉聯接的用法詳解

          時間:2021-04-22來源:www.snowmanhill.com作者:電腦系統城

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

           

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

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

          1 select * from t1 cross join t2

           

          2、交叉聯接的語法格式

          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

           

          3、交叉查詢的使用場景

           

          3.1 交叉聯接可以查詢全部數據

          -- 示例

          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

           

          3.2 交叉聯接優化查詢性能

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

           

          4、總結

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

          分享到:

          相關信息

          系統教程欄目

          欄目熱門教程

          人氣教程排行

          站長推薦

          熱門系統下載

          亚洲精品中文字幕无码专区一,中文字幕av一区乱码深夜动态福利,粗大的内捧猛烈进出少妇