大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子

今天给大家带来, 根据条件进行复制的案例

with t1 as (

select 1 seq ,'AK' id ,'A' type ,'g1' goods from dual union all

select 2 seq ,'PS' id ,'B' type ,'iphone' goods from dual union all

select 3 seq ,'BE' id ,'B' type ,'g2' goods from dual

)

select * from t1 ;

+-----+----+------+--------+

| seq | id | type | goods |

+-----+----+------+--------+

| 1 | AK | A | g1 |

| 2 | PS | B | iphone |

| 3 | BE | B | g2 |

+-----+----+------+--------+

3 rows in set (0.00 sec)

如上所示,有一个表t1 ,有三行数据

现在需求是,根据type 的值'A','B' 要求,如果是'A' 那么还是原来的行数

如果是'B' 那么需要复制五行数据。

如下所示

no | seq | id | type | goods

1, 1, AK, A, g1

2, 2, PS, B, iphone

3, 2, PS, B, t2

4, 2, PS, B, t3

5, 2, PS, B, t4

6, 2, PS, B, t5

7, 3, BE, B, g2

8, 3, BE, B, t2

9, 3, BE, B, t3

10, 3, BE, B, t4

11, 3, BE, B, t5

我们先来对这个需求进行分析,

第一 因为对行进行复制,所以需要一个复制表

第二 根据条件进行复制

第三 对每个条件的第一个值用t1表的goods进行替换

根据如上所示,我们先来进行第一步

先创建一个复制表,这里所涉及两种情况,因为最多复制5行,A种类型可以看做是id为1

with t2 as (

select 1 id ,'t1' a1 from dual union all

select 2 id ,'t2' a1 from dual union all

select 3 id ,'t3' a1 from dual union all

select 4 id ,'t4' a1 from dual union all

select 5 id ,'t5' a1 from dual

)

select * from t2

+----+----+

| id | a1 |

+----+----+

| 1 | t1 |

| 2 | t2 |

| 3 | t3 |

| 4 | t4 |

| 5 | t5 |

+----+----+

第二 根据条件进行复制

我们这里设置了一个连接条件 ,就是当type='A'的时候我们返回1

当type='B'的时候 我们返回5

然后我们进行了一个>= join

with t1 as (

select 1 seq ,'AK' id ,'A' type ,'g1' goods from dual union all

select 2 seq ,'PS' id ,'B' type ,'iphone' goods from dual union all

select 3 seq ,'BE' id ,'B' type ,'g2' goods from dual

),

t2 as (

select 1 id ,'t1' a1 from dual union all

select 2 id ,'t2' a1 from dual union all

select 3 id ,'t3' a1 from dual union all

select 4 id ,'t4' a1 from dual union all

select 5 id ,'t5' a1 from dual

)

select * from t1 join t2

on case when t1.type = 'A' then 1

when t1.type = 'B' then 5 end >= t2.id

order by seq ,t1.id

+-----+----+------+--------+----+----+

| seq | id | type | goods | id | a1 |

+-----+----+------+--------+----+----+

| 1 | AK | A | g1 | 1 | t1 |

| 2 | PS | B | iphone | 1 | t1 |

| 2 | PS | B | iphone | 2 | t2 |

| 2 | PS | B | iphone | 3 | t3 |

| 2 | PS | B | iphone | 4 | t4 |

| 2 | PS | B | iphone | 5 | t5 |

| 3 | BE | B | g2 | 1 | t1 |

| 3 | BE | B | g2 | 2 | t2 |

| 3 | BE | B | g2 | 3 | t3 |

| 3 | BE | B | g2 | 4 | t4 |

| 3 | BE | B | g2 | 5 | t5 |

+-----+----+------+--------+----+----+

如上所示,我们就完成了 有条件的复制

剩下就剩最后一步

第三 对每个条件的第一个值用t1表的goods进行替换

我们可以利用case when 语句对t2.id =1的时候用t1.goods其余的用t2.a1进行替换

with t1 as (

select 1 seq ,'AK' id ,'A' type ,'g1' goods from dual union all

select 2 seq ,'PS' id ,'B' type ,'iphone' goods from dual union all

select 3 seq ,'BE' id ,'B' type ,'g2' goods from dual

),

t2 as (

select 1 id ,'t1' a1 from dual union all

select 2 id ,'t2' a1 from dual union all

select 3 id ,'t3' a1 from dual union all

select 4 id ,'t4' a1 from dual union all

select 5 id ,'t5' a1 from dual

)

select

t1.seq,t1.id,t1.type,

case when t2.id =1 then t1.goods

else t2.a1 end goods

from t1 join t2

on case when t1.type = 'A' then 1

when t1.type = 'B' then 5 end >= t2.id

order by seq ,t1.id

+-----+----+------+--------+

| seq | id | type | goods |

+-----+----+------+--------+

| 1 | AK | A | g1 |

| 2 | PS | B | iphone |

| 2 | PS | B | t2 |

| 2 | PS | B | t3 |

| 2 | PS | B | t4 |

| 2 | PS | B | t5 |

| 3 | BE | B | g2 |

| 3 | BE | B | t2 |

| 3 | BE | B | t3 |

| 3 | BE | B | t4 |

| 3 | BE | B | t5 |

+-----+----+------+--------+

最后一步就是赋予序列号,MySQL 8.0 有窗口函数

with t1 as (

select 1 seq ,'AK' id ,'A' type ,'g1' goods from dual union all

select 2 seq ,'PS' id ,'B' type ,'iphone' goods from dual union all

select 3 seq ,'BE' id ,'B' type ,'g2' goods from dual

),

t2 as (

select 1 id ,'t1' a1 from dual union all

select 2 id ,'t2' a1 from dual union all

select 3 id ,'t3' a1 from dual union all

select 4 id ,'t4' a1 from dual union all

select 5 id ,'t5' a1 from dual

)

select

row_number() over( order by t1.seq ,t1.id) no ,

t1.seq,t1.id,t1.type,

case when t2.id =1 then t1.goods

else t2.a1 end goods

from t1 join t2

on case when t1.type = 'A' then 1

when t1.type = 'B' then 5 end >= t2.id

+----+-----+----+------+--------+

| no | seq | id | type | goods |

+----+-----+----+------+--------+

| 1 | 1 | AK | A | g1 |

| 2 | 2 | PS | B | iphone |

| 3 | 2 | PS | B | t2 |

| 4 | 2 | PS | B | t3 |

| 5 | 2 | PS | B | t4 |

| 6 | 2 | PS | B | t5 |

| 7 | 3 | BE | B | g2 |

| 8 | 3 | BE | B | t2 |

| 9 | 3 | BE | B | t3 |

| 10 | 3 | BE | B | t4 |

| 11 | 3 | BE | B | t5 |

+----+-----+----+------+--------+

谢谢大家~ 欢迎转发

我的微信公众号:SQL开发与优化(sqlturning)

mysql join 条件_MySQL Join 竟然可以这么玩?根据条件 进行复制相关推荐

  1. mysql join性能_Mysql Join语法解析与性能分析

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...

  2. mysql join 性能测试_Mysql Join语法解析与性能分析

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: SELECT * FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona t ...

  3. mysql join 自联结_MySQL JOIN | 联结

    联结是利用SQL的SELECT能执行的最重要的操作.为了提高存储的有效性和避免数据冗余,往往会将有关联的数据存储在好几张表中,那么怎样用一条SELECT语句就能检索出这些数据呢? 答案是JOIN(联结 ...

  4. mysql myisam 主从_MySQL的主从复制Replication之MyIsam和InnoDB数据复制发布

    MyIsam发布相对简单,把库下面所有文件拷过去就好了.复制Innodb的做法和MyIsam类似,只不过Innodb引擎下的表的数据内容不再是存在同一的数据库目录下(MyIsam就是这么做的),Inn ...

  5. mysql不用left join_MySQL在右表数据不唯一的情况下使用left join的方法_MySQL - join

    一.Join语法概述join 用于多表中字段之间的联系,语法如下:... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditionatable1:左表 ...

  6. mysql natural join用法_MySQL NATURAL JOIN

    NATURAL JOIN 也叫自然连接,实际是属于 JOIN 的一种. MySQL NATURAL JOIN 语法如下: ... FROM table1 NATURAL JOIN table2 ... ...

  7. leftjoin多个on条件_MYSQL|为什么LEFT JOIN会这么慢?

    之前谈了怎样后台导出SAP序时账,因为导出的序时账数据量较大(3家主体公司,2017-2020年的数据),用了数据库MYSQL中的LEFT JOIN 来处理连接多表汇总数据,查询太慢啦,后来沦落到用手 ...

  8. mysql left join 中文_MySQL之LEFT JOIN问题汇总

    使用ON和WHRERE对表数据过滤 背景 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论.商城里一个货物有多少评论.一条评论有多少个赞等等.但是由于对j ...

  9. mysql 或hive left join不加关联条件

    mysql left join不加关联条件 create table if not exists u1 (id int,name varchar(20) ) ENGINE = MyISAMDEFAUL ...

最新文章

  1. 聊一聊如何优雅地向程序员提问题
  2. 当你再面对大多数需求时能够说这些问题我以前做过,那你就。。。
  3. mysql查询条数为零_mysql 查询每个月发布的文章数。月份无数据显示为0。如何写SQL呢...
  4. WCF系列(五) -- 也谈序列化(下)
  5. 物联网应用层安全威胁_物联网安全国家标准发布,物联网安全产业链确立
  6. 路由器太远手机接收不到信号怎么办?
  7. edius隐藏快捷键_EDIUS素材隐藏快捷键是什么啊?
  8. ARINC429硬件层初探
  9. php聊天功能界面,php实现聊天室功能完整代码
  10. 工作缺点和不足及措施_个人总结缺点和不足
  11. 记录——python与华为云数据库MYSQL的交互
  12. 在ARM处理器架构下部署kettle etl工具注意事项
  13. 2018年SCI论文--整合GEO数据挖掘完整复现 八 :STRING数据库构建蛋白质相互作用网络(PPI),cytoscape软件筛选hub基因
  14. boss直聘账号异常登不上_五条人XBOSS直聘推出麻将盲盒
  15. Flink之Trigger与Evictor
  16. 迈拓恢复出厂设置图解_电脑系统怎么重置呢?教你恢复出厂设置
  17. 知乎高赞:为什么有些大公司技术弱爆了?
  18. 全奖博士招生,英国考文垂大学
  19. c语言ole错误,OLE错误C0000094
  20. 融云通信云发力教育行业 助在线教育风口继续腾云

热门文章

  1. 为何这名全栈工程师说“抛弃 React、Angular”?
  2. PHP 没有真正的数组!
  3. 物联网时代,隐私还有救吗?
  4. 什么是 DNS 劫持、投毒、解析?看这文就懂了!
  5. 从 SAS 到 NVMe,换个底盘就完儿事了?
  6. 苏宁入局区块链;山东用阿里的AI抓违建;印度拟让苹果退网 | 极客头条
  7. tomcat原理及作用,MySQL数据中有很多换行符和回车符
  8. JAVA解决实例问题_解决java方法
  9. eplan加密狗已损坏_EPLAN Electric P8 仿真加密狗 error 1068 问题
  10. post请求体 ajax,ajax的post请求 @RequestBody解析问题