Join连接

编辑
  • 文档创建者:zsh331
  • 浏览次数:3942次
  • 编辑次数:5次
  • 最近更新:Kevin-s 于 2019-06-17
  • 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

    此页面有帮助吗?只是浏览 [ 去社区提问 ]