精华内容
下载资源
问答
  • Flink join终结者:SQL Join

    千次阅读 2019-11-10 19:33:58
    SQL是开发人员与数据分析师必备的技能,Flink也提供了Sql方式编写任务,能够很大程度降低开发运维成本,这篇是flink join的终极篇SQL Join, 首先介绍sql join使用方式、然后介绍global join带来的状态存储成本及解决...

    点击上方蓝

    字关注~

           

    SQL是开发人员与数据分析师必备的技能,Flink也提供了Sql方式编写任务,能够很大程度降低开发运维成本,这篇是flink join的终极篇SQL Join, 首先介绍sql join使用方式、然后介绍global join带来的状态存储成本及解决方式、最后从源码角度分析sql join实现。

    一、SQL JOIN使用方式

    对于sql join可以分为两类:Global Join、Time-windowed Join

    • Global Join
      Global Join表示全局join, 也可以称为无限流join, 由于没有时间限制,任何时候流入的数据都可以被关联上,支持inner join、left join、right join、full join 连接语法。使用语法遵循standard ANSI SQL。使用方式:

    
       
    1. SELECT *

    2. FROM Orders INNER/LEFT/RIGHT/FULL JOIN Product ON Orders.productId = Product.id

    • Time-windowed Join
      基于时间窗口的join, 流表的数据关联必须在一定的时间范围内,同样支持inner join、left join、right join、full join,但是不同的是条件中带有时间属性条件,有以下几种使用方式:

    
       
    1. ltime = rtime

    2. ltime >= rtime AND ltime < rtime + INTERVAL '10' MINUTE

    3. ltime BETWEEN rtime - INTERVAL '10' SECOND AND rtime + INTERVAL '5' SECOND

    ltime、rtime表示流表的时间属性字段。
    其实现与interval join 使用了相同的实现方式,不同的是:
    a. Time-windowed Join 即可支持Event-Time,也可支持Processing-Time
    b. interval join 只支持inner join,Time-windowed Join支持多种类型join
    Flink intervalJoin 使用与原理分析 中订单流与地址流为例,sql实现:

    
       
    1. select o.userId,a.addrId from orders o left join address a on o.addrId=a.addrId

    2. and o.rtt BETWEEN a.rt - INTERVAL '5' SECOND AND a.rt - INTERVAL '1' SECOND

    二、Idle State Retention Time 使用

    global join 能够join 上任何时刻的数据,是由于状态中保存了两个流表的所有数据,这些数据都保存在状态中,默认情况下是不会被过期,但是两个流表又是持续输入的,待数日或者数月之后,状态数据会无限增大,但是很多时候我们数据关联具有时效性,例如只要求当天数据关联即可,那么这种方式会内存或者磁盘造成不必要浪费。那我们的目标就是能够设置状态ttl,在到达过期时间能够被自动清除,在DataStream API 可以通过StateTtlConfig 来设置状态的ttl, 但是sql方式就无法通过这种方式设置,好在flink 提供了Idle State Retention Time 空闲状态的保留时间,通过配置StreamQueryConfig来设置ttl时间,并且只能按照Processing-time来清理数据,从数据流入系统到当数据未被读写时间达到ttl 就会被自动清除。先看下其使用方式:

    
       
    1. val config=tabEnv.queryConfig.withIdleStateRetentionTime(Time.minutes(1),Time.minutes(6))

    2. tabEnv.sqlUpdate('"',config)

    3. tabEnv.sqlQuery("",config)

    4. tab.writeToSink(sink,config)

    withIdleStateRetentionTime(minTime: Time, maxTime: Time), minTime/maxTime 分别表示空闲保留最小/最大时间,但是必须满足maxTime-minTime>=5min,接下来看下数据的ttl设置:
    初始默认的数据ttl = curProcessTime(数据流入当前系统时间) + maxRetentionTime(maxTime),之后每有相同的数据流入,只要满足curProcessTime + minRetentionTime > oldExpiredTime(上一次设置ttl的时间),就将其ttl设置为curProcessTime + maxRetentionTime。

    另外还有两点需注意:

    • Idle State Retention Time 不是全局有效,需要在每一个使用sqlUpdate/sqlQuery中单独设置

    • 数据定时清理同样是依赖flink 定时机制,会将定时数据存储在内存状态中,会对内存造成比较大的压力,可以选择rocksDB 来代替内存作为stateBackend

    三、源码分析

    Flink SQL 中使用了apache calcite来完成sql解析、验证、逻辑计划/物理计划生成以及优化工作,物理计划都需要实现DataStreamRel接口,其中DataStreamWindowJoin与DataStreamJoin 分别对应Time-window join 与 global window的物理执行计划,由于Time-window join 与 interval-join的实现步骤大体相似,最终还是会调用到IntervalJoinOperator,这里不做分析。主要分析一下,Global window 的执行过程,从DataStreamJoin入手。

    • DataStreamJoin中translateToPlan方法。
      该方法获取左右两个流表对应的DataStream, 根据不同join 类型选择不同的ProcessFunction,例如inner join 选择NonWindowInnerJoin,将leftDataStream 与 rightDataStream 进行connect 得到ConnectedStreams 然后执行对应的ProcessFunction

    • 以 inner join为例分析NonWindowInnerJoin, 继承了NonWindowJoin,而NonWindowJoin又继承了CoProcessFunction,与ProcessFunction针对一个流相反,CoProcessFunction是针对两个流的low level api, 可以访问状态、注册定时器。join 逻辑在其processElement方法中

    
       
    1. override def processElement(

    2. value: CRow,

    3. ctx: CoProcessFunction[CRow, CRow, CRow]#Context,

    4. out: Collector[CRow],

    5. timerState: ValueState[Long],

    6. currentSideState: MapState[Row, JTuple2[Long, Long]],

    7. otherSideState: MapState[Row, JTuple2[Long, Long]],

    8. isLeft: Boolean): Unit = {

    9. val inputRow = value.row

    10. updateCurrentSide(value, ctx, timerState, currentSideState)

    11. cRowWrapper.setCollector(out)

    12. cRowWrapper.setChange(value.change)

    13. val otherSideIterator = otherSideState.iterator()

    14. // join other side data

    15. while (otherSideIterator.hasNext) {

    16. val otherSideEntry = otherSideIterator.next()

    17. val otherSideRow = otherSideEntry.getKey

    18. val otherSideCntAndExpiredTime = otherSideEntry.getValue

    19. // join

    20. cRowWrapper.setTimes(otherSideCntAndExpiredTime.f0)

    21. callJoinFunction(inputRow, isLeft, otherSideRow, cRowWrapper)

    22. // clear expired data. Note: clear after join to keep closer to the original semantics

    23. if (stateCleaningEnabled && curProcessTime >= otherSideCntAndExpiredTime.f1) {

    24. otherSideIterator.remove()

    25. }

    26. }

    27. }

    两个MapState对应两个流的缓存数据,key表示具体的数据ROW,Value表示数据ROW的数量与过期时间,由于数据流入过程中可能会存在多条相同的记录,以数据ROW作为key这种方式可以减少内存使用.
    ValueState 用于存储数据的过期时间,以便任务失败恢复能够继续对数据执行过期操作。


    processElement 执行流程:
    a. updateCurrentSide 保存数据与更新数据的count与ttl, 同时会注册数据的过期时间,数据的过期时间是根据Idle State Retention Time来设置的,从StreamQueryConfig可以获取到
    b. 循环遍历另外一个状态,调用callJoinFunction输出数据,在callJoinFunction里面使用的joinFunction是通过FunctionCodeGenerator动态生成的在,在DataStreamJoin的translateToPlan方法中被调用到,有兴趣可以debug 方式copy下来研读一下。

    • 过期数据的清理定时是在updateCurrentSide注册的,其清理工作是在NonWindowJoin的onTimer方法完成,onTimer方法是从CoProcessFunction中继承过来的。在onTimer主要做过期时间判断并且清理。

    精彩阅读

    end

    关注回复Flink获取更多信息~

    展开全文
  • Spark SQL Join类型

    千次阅读 2019-04-12 00:24:37
    Spark SQL join工作是通过使用executors 操作DataFrame的多个分区,具体的过程和性能依赖join type和datasets的特征。join的过程中,包含了shuffle join 和broadcast join; 在两个大的datasets join的过程中,进行...

    Spark SQL join工作是通过使用executors 操作DataFrame的多个分区,具体的过程和性能依赖join type和datasets的特征。join的过程中,包含了shuffle join 和broadcast join;

    在两个大的datasets join的过程中,进行了 shuffle join,使左右的dataset的分区数据到达executors。如:

                                          

     当一个大的dataset和一个小的dataset进行join操作时,小的数据集通过广播的方式,广播到executors,过程如:

                                           

    join  的类型分为:

     1.inner   通过左dataset的每一行和右dataset的行进行比较,匹配的行 并且都没有null值, 结合在一起。

                                           

     2.cross  通过左dataset的每一行和右 dataset的每一行生成一个笛卡尔积运算结果 。

                                          

     3.outer,full,fullouter  左、右dataset所有的行形成 一个dataset,若新的dataset的行只包含左或右的dataset的数据时,则补充数据为null。

                                                    

    4.leftanti  结果dataset只包含存在于左dataset,而不包含于右dataset的数据。

    5.left,leftouter  结果dataset包含左dataset的所有的加上右dataset的common rows,像inner join一样,不包含于右dataset的填充为null。

                                               

    6. leftsemi  结果dataset包含左、右数据集common rows,但仅仅包含左dataset的数据。

    7.right,rightouter  结果dataset包含右dataset的所有行加上右、左common rows,右dataset的行不存在于左dataset是,填充数据为null。

                                                 

    展开全文
  • SQL 连接(JOIN) 0.Sql 之 笛卡尔积 1.Sql 之 inner join 2.Sql 之 left join | left outer join 3.Sql 之 right join | right outer join 4.Sql 之 full join | full outer join 5.Sql 之 union and union all...

    目录

    SQL 连接(JOIN)

    0.Sql 之 笛卡尔积

    1.Sql 之 inner join

    2.Sql 之 left join | left outer join

    3.Sql 之 right join | right outer join

    4.Sql 之 full join | full outer join

    5.Sql 之 union and union all

    6.Sql 之 natural join



    SQL 连接(JOIN)

        INNER JOIN:如果表中有至少一个匹配,则返回行
        LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
        RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
        FULL JOIN:只要其中一个表中存在匹配,则返回行

    0.Sql 之 笛卡尔积

    注释:INNER JOIN 与 JOIN 是相同的。

    数据库表:

     

    首先,我们需要先明白一个概念——笛卡尔积:

    笛卡尔积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
    例子:
    假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为
    {
    (a, 0),
    (a, 1), 
    (a, 2), 
    (b, 0), 
    (b, 1), 
    (b, 2)
    }。

    现在来观察上面两个表形成的笛卡尔积:

    1.Sql 之 inner join

    注释:INNER JOIN 与 JOIN 是相同的。(相当于取交集)

    注释:INNER JOIN 关键字在表中存在至少一个匹配时返回行。

    SQL join 用于把来自两个或多个表的行结合起来。

    最简单的就是内连接,inner join.

    -- 使用where连接
    SELECT
    	p.id,
    	p.NAME,
    	pd.id AS _id,
    	pd.pid,
    	pd.price,
    	pd.num 
    FROM
    	product p,
    	product_detail pd 
    WHERE
    	p.id = pd.pid;	

    -- 	inner join or join
    	
    	SELECT
    	p.id,
    	p.NAME,
    	pd.id AS _id,
    	pd.pid,
    	pd.price,
    	pd.num 
    	from product p
    	INNER join product_detail pd
    	on p.id = pd.pid;

    以上两种方式查询的结果是一样的。(两个都相当于内连接)

    总结:内连接inner join是将两个或两个以上的表连接起来,用on来连接,只用当on所限制的条件满足的时候,笛卡尔积组成的结果行才会返回。

    如下图:(只有on后面的条件,p.id = pd.pid成立的时候)

    2.Sql 之 left join | left outer join

    注释:LEFT JOIN 关键字从左表(Websites)返回所有的行,即使右表(access_log)中没有匹配。

    -- left join or left outer join
    	
    SELECT
    	p.id,
    	p.NAME,
    	pd.id AS _id,
    	pd.pid,
    	pd.price,
    	pd.num 
    	from product p
    	left join product_detail pd
    	on p.id = pd.pid;

    在左连接的基础上加上过滤条件

    SELECT
    	p.id,
    	p.NAME,
    	pd.id AS _id,
    	pd.pid,
    	pd.price,
    	pd.num 
    	from product p
    	left join product_detail pd
    	on p.id = pd.pid and p.id = 1

    使用where进行过滤的

    注意:在使用 left jion 时,onwhere 条件的区别如下:

    • 1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。

    • 2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    3.Sql 之 right join | right outer join

    注释:RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

    select 
    p.id,
    p.name,
    pd.id as _id,
    pd.pid,
    pd.price,
    pd.num
    from product p
    right join product_detail pd
    on p.id = pd.pid

    加入过滤条件的有连接 on 后面接and进行过滤

    select 
    p.id,
    p.name,
    pd.id as _id,
    pd.pid,
    pd.price,
    pd.num
    from product p
    right join product_detail pd
    on p.id = pd.pid
    and pd.pid = 1

     

    select 
    p.id,
    p.name,
    pd.id as _id,
    pd.pid,
    pd.price,
    pd.num
    from product p
    right join product_detail pd
    on p.id = pd.pid
    -- and pd.pid = 1
    where pd.pid = 1

    使用on过滤和where过滤跟上面的左连接是一样的。

    4.Sql 之 full join | full outer join

    注释:FULL OUTER JOIN 关键字返回左表(Websites)和右表(access_log)中所有的行

    (使用方式如上面两种那样,但是mysql不支持全连接)

    5.Sql 之 union and union all

    但是可以使用union关键字来实现所谓的全连接

    SELECT
    	p.id,
    	p.NAME,
    	pd.id AS _id,
    	pd.pid,
    	pd.price,
    	pd.num 
    FROM
    	product as p
    	left JOIN product_detail pd
    	ON p.id = pd.pid
    	
    UNION
     
     SELECT 
     p.id,
    	p.NAME,
    	pd.id AS _id,
    	pd.pid,
    	pd.price,
    	pd.num 
    FROM
     product p
     right join product_detail pd
     on p.id = pd.pid;

    上面是使用的是union,不显示重复行,但是如果把union换成union all 那么就会把重复行显示出来,

    效果如下图:(union all)

     

    6.Sql 之 natural join

     

    SELECT
    	* 
    FROM
    	product
    	NATURAL JOIN product_detail

     

    注释:自然连接默认是匹配两个表列名相同的,然后不重复显示。

    如下图,将数据库表设计改变:(改变第一个表的id名为pid)

    结果如下:

     

     

    ------------------------------------------------

    关注小编微信公众号获取更多资源和技术文档

     

    展开全文
  • Flink Windows 多流 JoinSQL Join

    千次阅读 2020-06-03 11:11:42
    Flink Windows Join 都是 Inner Join 两个流join时,先做join操作,形成JoinedStream,然后再指定Window,最后接着join后的transform操作。 案例: inputStream1:DataStream[(Long,String,Int)] = ... inputStream2:...

    Flink Windows Join 都是 Inner Join

    两个流join时,先做join操作,形成JoinedStream,然后再指定Window,最后接着join后的transform操作。

    案例:

    inputStream1:DataStream[(Long,String,Int)] = ...
    inputStream2:DataStream[(String,Long,Int)] = ...
    //通过DataStream Join方法将两个数据流关联
    inputStream1.join(inputStream2)
        //指定inputStream1的关联Key
        .where(_._1) 
        //指定inputStream2的关联Key
        .equalTo(_._2)/
        //指定Window Assigner
        .window(TumblingEventTimeWindows.of(Time.milliseconds(10)))
      .apply(<JoinFunction>) //指定窗口计算函数
    

    根据窗口的不同,数据计算的方式不同

    根据窗口的选择,依次对应于:

    滚动窗口关联:Tumbling Window Join

    滑动窗口关联:Sliding Window Join

    会话窗口关联:Session Window Join

    间隔关联:Interval Join

    间隔关联 Join

    间隔关联与其他窗口关联不同,间隔关联的数据元素关联范围不依赖窗口划分,而是通过DataStream元素的时间加上或减去指定Interval作为关联窗口,然后和另外一个DataStream的数据元素时间在窗口内进行Join操作。

    示例代码:

    
    //创建黑色元素数据集
    val blackStream: DataStream[(Int, Long)] = env.fromElements((2, 21L), (4, 1L), (5, 4L))
    //创建白色元素数据集
    val whiteStream: DataStream[(Int, Long)] = env.fromElements((2, 21L), (1, 1L), (3, 4L))
    //通过Join方法将两个数据集进行关联
    val windowStream: DataStream[String] = blackStream.keyBy(_._1)
    //调用intervalJoin方法关联另外一个DataStream
      .intervalJoin(whiteStream.keyBy(_._1))
    //设定时间上限和下限
      .between(Time.milliseconds(-2), Time.milliseconds(1))
      .process(new ProcessWindowFunciton())
    //通过单独定义ProcessWindowFunciton实现ProcessJoinFunction
    class ProcessWindowFunciton extends ProcessJoinFunction[(Int, Long), (Int, Long), String] {
      override def processElement(in1: (Int, Long), in2: (Int, Long), context: ProcessJoinFunction[(Int, Long), (Int, Long), String]#Context, collector: Collector[String]): Unit = {
        collector.collect(in1  + ":" + (in1._2 + in2._2))
      }
    }
    

    Flink SQL Join

    经典的Join算法-归并连接算法

    经典的Join算法-哈希连接算法

    Flink 流式SQL - 普通连接Join

    对于不带窗口的全量连接,内部Join算子,会维护A、B两张表的哈希索引。当A表中插入一条数据时会查B的索引,寻找Join的条件数据,同时将本条数据加入A的索引。反之亦然。但是这种join会随着数据量的增加,哈希表维护成本可能会无限增长下去。

    解决方式是通过状态TTL等手段加以限制。

    Flink 流式SQL - 基于时间窗口连接Join

    Flink 流式SQL - 基于待时间记录的历史表连接

    展开全文
  • sql join中on条件后接and和where

    千次阅读 多人点赞 2021-01-12 15:05:52
    场景1:left join + on a.xx = b.xx and a.xx2 = 'aa' 场景2:left join + on a.xx = b.xx and b.xx2 = 'aa' 场景3:left join + on a.xx = b.xx whereb.xx2 = 'aa' 场景4:inner join + on a.xx = b.xx where a....
  • SQL join 完全用法

    2011-06-25 08:52:44
    SQL join 完全用法 SQL join 完全用法 学习sql join
  • 本文主要介绍Spark SQL的多表连接,需要预先准备测试数据。分别创建员工和部门的Datafame,并注册为临时视图,代码如下: val spark = SparkSession.builder().appName("aggregations").master("local[2]")....
  • SQL join,left join ,right join , inner join , outer join用法解析及HIVE join 优化
  • 转载 Flink SQL join INTERVAL 代码案例

    千次阅读 2019-07-19 12:23:08
    1,下面的案例就是 在下单之后,在一个小时之内付款的数据才是有效数据,使用 JOIN INTERVAL 来实现,这可是知识盲点,不过真的是好用。 package com.coder.flink.core.table_sql.sql_function import java.sql....
  • sql join 与where的区别

    千次阅读 2016-03-18 14:23:17
    今天在分析一个sql语句的时候 发现 left join 与where a=b(+) 产生的执行计划不一样 而且效率也是不一样的 到底怎么回事 我在网上找了篇文章分享  (1.)select语句的执行顺序 Processing Order of the SELECT s
  • sql join的5种连接方式

    千次阅读 2016-04-20 14:51:06
    首先介绍一下,join有5中连接方式:1.内连接(inner join...on...)2.全外连接(full join ....on ... )3.左连接(left join ...on...)4.右连接(right join ...on ...)5.交叉连接(cross join ...on ...) ...
  • sql join、group by原理

    千次阅读 2016-09-12 11:01:41
    join 原理sql以下边的sql为例,假设有a、b两张表select * from user a,age_info b a表的第一条记录首先拿a表的第一条记录,去匹配b表的第一条记录,由于没有过滤条件,匹配,所以加入结果集第一条记录就是 然后,再...
  • SQL join 和 where 等多条件连用

    千次阅读 2017-03-23 22:13:00
    ...For simplicity, assume ...JOIN table2 ON table1 . foreignkey = table2 . primarykey WHERE ( some other conditions ) Order 条件放在最后 可以理解为先选择完然后sort
  • 【转载】SQL JOIN 的7种用法。

    千次阅读 2018-10-30 09:45:20
    1、INNER JOIN (内连接) 2、LEFT JOIN (左连接) 3、RIGHT JOIN (右连接) 4、OUTER JOIN (外连接) 5、LEFT JOIN EXCLUDING INNER JOIN (左连接排除内连接结果) 6、RIGHT JOIN EXCLUDING INNER JOIN (右...
  • Join 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。 下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。 JOIN: 如果表中有至少一个匹配,则返回行 LEFT JOIN: 即使右...
  • Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。 数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表...
  • SQL JOIN

    千次阅读 2014-08-25 16:12:54
    Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接、外联接和交叉联接等,Join用于根据两个或者多个表中的列之间的关系,从这些表中查询数据。     2、怎么使用JOIN? ...
  • SQL left join

    2014-08-18 14:19:12
    SQL left join用法,初学者应用
  • sql join 算法 时间复杂度

    千次阅读 2016-08-26 12:04:34
    参考stackoverflow笔记sql语句如下:SELECT T1.name, T2.date FROM T1, T2 WHERE T1.id=T2.id AND T1.color='red' AND T2.type='CAR'假设T1有m行,T2有n行,那么,普通情况下,应该要遍历T1的每一行的id(m),...
  • Spark-sql Join优化=>(cache+BroadCast)

    千次阅读 2016-10-29 14:23:05
    spark-sql或者hive-sql 很多业务场景都会有表关联的的操作,在hive中有map side join优化,对应的在spark-sql中也有map side join。spark中如果在参与join的表中存在小表,可以采用cache broadcast的方式进行优化,...
  • SQL join关联三个表或多个表

    千次阅读 2014-02-16 16:26:51
    http://www.17jo.com/program/sql/base/JoinMany.html
  • 面试排坑指南之SQL join

    千次阅读 2020-04-24 21:34:59
    在面试的时候曾3次踩过了sql join的坑,第一次是校招面试的时候,面的是国内某大行的开发岗,被问到会不会使用sql join,当时直接回答的是不会,只会使用简单的sql操作。第二次面试的是另一大行的测试岗,人家直接问...
  • hive sql join 时字段类型不一致问题

    千次阅读 2017-06-13 16:40:07
    在用hive sql 查询数据时会遇到 两个表通过字段join,假如两个字段类型不一样,有可能出现莫名其妙的结果。 解决方法: 将2个字段类型转成一样。比如 两个表通过id关联, 一个是 string 一个是 int,可以将 string ...
  • SQL Join on联合查询和子查询

    千次阅读 2014-05-06 19:50:05
    Join on 联合查询: select
  • SQL join on 性能分析

    千次阅读 2011-08-01 16:44:28
    今天突然遇到一个问题,到底是sql语句先join后where 效率高,还是先where后join高 经过测试是一样的 SELECT MaterialID,Amount, ABC FROM ( SELECT MaterialID,Amount FROM SameWayAg
  • Flink SQL 如何实现数据流的 Join

    千次阅读 2019-12-17 18:34:35
    无论在 OLAP 还是 OLTP 领域,Join 都是业务常会涉及到且优化规则比较复杂的 SQL 语句。对于离线计算而言,经过数据库领域多年的积累,Join 语义以及实现已经十分成熟,然...
  • Sql Join各种用法

    千次阅读 2013-06-03 15:39:15
    Sql Join各种用法 图片
  • SQL多字段JOIN(两个表JOIN ON多字段)

    千次阅读 2021-01-12 14:02:20
    全网首发SQL多字段JOIN JOIN ON 多字段 HIVE多字段JOIN MySQL多字段JOIN 两个表JOIN ON多字段 JOIN ON 后面不是 等于号

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 439,570
精华内容 175,828
关键字:

sqljoin