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


Posted in SQL Server onApril 22, 2021

今天给大家介绍SQLServer中交叉联接的用法,希望对大家能有所帮助!

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

交叉联接是联接查询的第一个阶段,它对两个数据表进行笛卡尔积。即第一张数据表每一行与第二张表的所有行进行联接,生成结果集的大小等于T1*T2。

select * from t1 cross join t2

2、交叉联接的语法格式

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

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 交叉联接可以查询全部数据

-- 示例

-- 员工表 
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代替,效率会更高一些。如果需要为所有的可能性都返回数据联接查询可能会非常实用。

到此这篇关于SQL Server中交叉联接的用法介绍的文章就介绍到这了,更多相关SQL Server交叉联接内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

SQL Server 相关文章推荐
在 SQL 语句中处理 NULL 值的方法
Jun 07 SQL Server
sql字段解析器的实现示例
Jun 23 SQL Server
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
Jun 30 SQL Server
SQL Server代理:理解SQL代理错误日志处理方法
Jun 30 SQL Server
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
Jul 07 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
sql server删除前1000行数据的方法实例
Aug 30 SQL Server
SQL Server实现分页方法介绍
Mar 16 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
SQL Server的存储过程与触发器以及系统函数和自定义函数
Apr 10 SQL Server
SQL SERVER中的流程控制语句
May 25 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
SqlServer 垂直分表(减少程序改动)
Apr 16 #SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
SQLServer2008提示评估期已过解决方案
SQLServer2019 数据库的基本使用之图形化界面操作的实现
SQLServer2019 数据库环境搭建与使用的实现
SQLServer 日期函数大全(小结)
Apr 08 #SQL Server
SQL SERVER中常用日期函数的具体使用
You might like
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
基于vue+echarts数据可视化大屏展示的实现
2020/12/25 Vue.js
python list中append()与extend()用法分享
2013/03/24 Python
Python判断Abundant Number的方法
2015/06/15 Python
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python实现的字典值比较功能示例
2018/01/08 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
Django forms表单 select下拉框的传值实例
2019/07/19 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
Python实现动态给类和对象添加属性和方法操作示例
2020/02/29 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
Python实现播放和录制声音的功能
2020/08/12 Python
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
金山毒霸系列的笔试题
2013/04/13 面试题
简述数组与指针的区别
2014/01/02 面试题
公务员政审单位鉴定材料
2014/05/16 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
回复函范文
2015/07/14 职场文书
工作简报格式范文
2015/07/21 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python