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 相关文章推荐
2021-4-5课程——SQL Server查询【3】
Apr 05 SQL Server
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
SQLServer2008提示评估期已过解决方案
Apr 12 SQL Server
SQL Server中交叉联接的用法详解
Apr 22 SQL Server
解决sql server 数据库,sa用户被锁定的问题
Jun 11 SQL Server
SQLServer中JSON文档型数据的查询问题解决
Jun 27 SQL Server
Spark SQL 2.4.8 操作 Dataframe的两种方式
Oct 16 SQL Server
SQL SERVER实现连接与合并查询
Feb 24 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
SQL Server #{}可以防止SQL注入
May 11 SQL Server
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
May 25 SQL Server
SQL Server2019安装的详细步骤实战记录(亲测可用)
Jun 10 SQL Server
SqlServer 垂直分表(减少程序改动)
Apr 16 #SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
SQLServer2008提示评估期已过解决方案
SQLServer2019 数据库的基本使用之图形化界面操作的实现
SQLServer2019 数据库环境搭建与使用的实现
SQLServer 日期函数大全(小结)
Apr 08 #SQL Server
SQL SERVER中常用日期函数的具体使用
You might like
使用PHP批量生成随机用户名
2008/07/10 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
php检测图片主要颜色的方法
2015/07/01 PHP
php短信接口代码
2016/05/13 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
Add a Formatted Table to a Word Document
2007/06/15 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
详解用场景去理解函数柯里化(入门篇)
2019/04/11 Javascript
Python MD5文件生成码
2009/01/12 Python
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
跟老齐学Python之做一个小游戏
2014/09/28 Python
python超简单解决约瑟夫环问题
2015/05/12 Python
Python检测生僻字的实现方法
2016/10/23 Python
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
澳大利亚正品化妆品之家:Cosmetic Capital
2017/07/03 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
J2EE是技术还是平台还是框架
2016/08/14 面试题
如何写好优秀的创业计划书
2014/01/30 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
工商局调档介绍信
2015/10/22 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书