• 售前

  • 售后

热门帖子
入门百科

SQL Server中交织联接的用法详解

[复制链接]
幸福341 显示全部楼层 发表于 2021-8-14 14:46:29 |阅读模式 打印 上一主题 下一主题
目次


  • 1、交叉联接(cross join)的概念
  • 2、交叉联接的语法格式
  • 3、交叉查询的使用场景

    • 3.1 交叉联接可以查询全部数据
    • 3.2 交叉联接优化查询性能

  • 4、总结

本日给大家先容SQLServer中交叉联接的用法,盼望对大家能有所资助!

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

交叉联接是联接查询的第一个阶段,它对两个数据表举行笛卡尔积。即第一张数据表每一行与第二张表的全部行举行联接,天生结果集的大小便是T1*T2。
  1. select * from t1 cross join t2
复制代码
2、交叉联接的语法格式


  1. select * from t1 cross join t2;--常用写法
  2. select * from t1, t2;-- SQL:1989的规范
  3. select * from t1 cross join t2
  4. where t1.col1=t2.col2;--等价于内部联接
  5. select * from t1 inner join t2  on t1.col1=t2.col2
复制代码
3、交叉查询的使用场景



3.1 交叉联接可以查询全部数据


-- 示例
  1. -- 员工表
  2. CREATE TABLE [dbo].[EmpInfo](
  3.   [empId] [int] IDENTITY(1,1) NOT NULL,
  4.   [empNo] [varchar](20) NULL,
  5.   [empName] [nvarchar](20) NULL,
  6. CONSTRAINT [PK_EmpInfo] PRIMARY KEY CLUSTERED  
  7. (
  8.   [empId] ASC
  9. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF
  10. , ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  11. ) ON [PRIMARY]
  12. -- 奖金表
  13. CREATE TABLE [dbo].[SalaryInfo](
  14.   [id] [int] IDENTITY(1,1) NOT NULL,
  15.   [empId] [int] NULL,
  16.   [salary] [decimal](18, 2) NULL,
  17.   [seasons] [varchar](20) NULL,
  18. CONSTRAINT [PK_SalaryInfo] PRIMARY KEY CLUSTERED  
  19. (
  20.   [id] ASC
  21. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF
  22. , ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  23. ) ON [PRIMARY]
  24. -- 季度表
  25. CREATE TABLE [dbo].[Seasons](
  26.   [name] [nchar](10) NULL
  27. ) ON [PRIMARY]
  28. GO
  29. SET IDENTITY_INSERT [dbo].[EmpInfo] ON  
  30. INSERT [dbo].[EmpInfo] ([empId], [empNo], [empName]) VALUES (1, N'A001', N'王强')
  31. INSERT [dbo].[EmpInfo] ([empId], [empNo], [empName]) VALUES (2, N'A002', N'李明')
  32. INSERT [dbo].[EmpInfo] ([empId], [empNo], [empName]) VALUES (3, N'A003', N'张三')
  33. INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons])
  34. VALUES (1, 1, CAST(3000.00 AS Decimal(18, 2)), N'第一季度')
  35. INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons])
  36. VALUES (2, 3, CAST(5000.00 AS Decimal(18, 2)), N'第一季度')
  37. INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons])
  38. VALUES (3, 1, CAST(3500.00 AS Decimal(18, 2)), N'第二季度')
  39. INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons])
  40. VALUES (4, 3, CAST(3000.00 AS Decimal(18, 2)), N'第二季度 ')
  41. INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons])
  42. VALUES (5, 2, CAST(4500.00 AS Decimal(18, 2)), N'第二季度')
  43. INSERT [dbo].[Seasons] ([name]) VALUES (N'第一季度')
  44. INSERT [dbo].[Seasons] ([name]) VALUES (N'第二季度')
  45. INSERT [dbo].[Seasons] ([name]) VALUES (N'第三季度')
  46. INSERT [dbo].[Seasons] ([name]) VALUES (N'第四季度')
  47. -- 查询每个人每个季度的奖金情况 如果奖金不存在则为0
  48. SELECT a.empName,b.name seasons ,isnull(c.salary,0) salary  
  49. FROM EmpInfo a  
  50. CROSS JOIN Seasons b
  51. LEFT OUTER JOIN SalaryInfo c ON a.empId=c.empId AND b.name=c.seasons
复制代码
3.2 交叉联接优化查询性能

针对一些环境可以接纳交叉联接的方式替代子查询,通过镌汰子查询造成的多次表扫描,从而可以提高优化查询的性能。

4、总结

交叉联接虽然支持使用WHERE子句筛选行,由于笛卡儿积占用的资源大概会许多,如果不是真正需要笛卡儿积的环境下,则应当制止地使用CROSS JOIN。发起使用INNER JOIN代替,服从会更高一些。如果需要为全部的大概性都返回数据联接查询大概会非常实用。
到此这篇关于SQL Server中交叉联接的用法先容的文章就先容到这了,更多相关SQL Server交叉联接内容请搜索草根技术分享从前的文章或继续浏览下面的相关文章盼望大家以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作