Join连接

编辑
文档创建者:zsh331 (73316 )     浏览次数:2119次     编辑次数:4次     最近更新:jiangsr 于 2018-06-13     

目录:

1. 描述编辑

由于一些特殊的数据展示,比如需要在一张报表上同时展示客户信息和对应的订单详情,这个时候就会用到客户表和订单表里的内容,虽然可以建立多个数据集然后通过单元格过滤来实现,但个人感觉还是不够直接,能不能有更便捷的方法呢?答案肯定是:有!

2. 思路编辑

在创建数据集时,对事先相关表通过SQL的Join方法进行关联,然后直接使用。

3. Join介绍编辑

通过图文并茂的方式对SQL的Join进行简单的介绍:join大致分为以下七种情况:

222

4. 示例编辑

4.1 准备数据

DROP TABLE [dbo].[test_a] GO CREATE TABLE [dbo].[test_a] ( [id] int NULL , [name] varchar(255) NULL ) GO -- ---------------------------- -- Records of test_a -- ---------------------------- INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'1', N'苹果') GO GO INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'2', N'橘子') GO GO INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'3', N'菠萝') GO GO INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'4', N'香蕉') GO GO INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'5', N'西瓜') GO GO ----------------------------------------------------------- DROP TABLE [dbo].[test_b] GO CREATE TABLE [dbo].[test_b] ( [id] int NULL , [name] varchar(255) NULL ) GO -- ---------------------------- -- Records of test_b -- ---------------------------- INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'1', N'梨子') GO GO INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'2', N'苹果') GO GO INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'3', N'草莓') GO GO INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'4', N'桃子') GO GO INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'5', N'香蕉') GO GO 

注:需要手动建test_a,test_b两个表。
4.2 示例介绍

1)Inner join

产生A和B的交集。

SELECT * FROM test_a INNER JOIN test_b ON test_a.name = test_b.name 
222
2)Full outer join
产生A和B的并集。对于没有匹配的记录,则以null做为值。
SELECT * FROM test_a FULL OUTER JOIN test_b ON test_a.name = test_b.name 
222
3)Left outer join 
产生表A的完全集,而B表中匹配的则有值,没匹配的以null值取代。
SELECT * FROM test_a LEFT OUTER JOIN test_b ON test_a.name = test_b.name 
222

4)Left outer join on where

产生在A表中有而在B表中没有的集合。

SELECT * FROM test_a LEFT OUTER JOIN test_b ON test_a.name = test_b.name WHERE test_b.name IS NULL 
222
5)RIGHT OUTER JOIN
产生表B的完全集,而A表中匹配的则有值,没匹配的以null值取代。
SELECT * FROM test_a RIGHT OUTER JOIN test_b ON test_a.name = test_b.name 
222
注:考虑到Mysql对full join 不支持的原因,在Mysql如果要实现full join的效果可采取变通的方式:
SELECT * FROM test_a LEFT OUTER JOIN test_b ON test_a.name = test_b.name UNION SELECT * FROM test_a RIGHT OUTER JOIN test_b ON test_a.name = test_b.name 
6)right outer join on where
产生在B表中有而在A表中没有的集合。
SELECT * FROM test_a RIGHT OUTER JOIN test_b ON test_a.name = test_b.name WHERE test_a.name IS NULL 
222
7)FULL OUTER JOIN WHERE
产生(A表中有但B表没有)和(B表中有但A表中没有)的数据集。
SELECT * FROM test_a FULL OUTER JOIN test_b ON test_a.name = test_b.name WHERE test_a.name IS NULL OR test_b.name IS NULL 
222
8)cross join
表A和表B的数据进行一个N*M的组合,即笛卡尔积(交差集)。一般来说,我们很少用到这个语法。因为这种集合的使用对于性能来说非常危险,尤其是表很大。

附件列表


主题: 专题总结
如果您认为本文档还有待完善,请编辑

文档内容仅供参考,如果你需要获取更多帮助,付费/准付费客户请咨询帆软技术支持
关于技术问题,您还可以前往帆软社区,点击顶部搜索框旁边的提问按钮
若您还有其他非技术类问题,可以联系帆软传说哥(qq:1745114201

此页面有帮助吗?