SQL关联查询不等值连接详解
原创需求 : 每份债券的每份债券symbol每天tdate不同剩余期的不同剩余期的不同剩余期term对应收益率对应收益率对应收益率yield , 打上标签flag (到期,行权)
flag赛场判定规则赛场判定规则赛场判定规则 一个代码对应一个代码 , 如果只有一条数据如果只有一条数据如果只有一条数据 则无论DataSource的值 , flag=到期
如果有两条数据,如果有两条数据线,则有两条数据 则term小为行使权利小为行使权利小为行使权利 , term大表示到期大表示到期
前提 : 一份债券换一份债券 第2列DataSource的范围是(01,05) 可以是这些中的任何一个,可以是任何一个,可以是这些中的任何一个 或者两者兼而有之也可能两者兼而有之
1 drop table if exists #a 2 create table #a (symbol varchar(10),datasource varchar(5),yield float,term int ,tdate varchar(10))
3 insert into #a 4 (symbol,datasource,yield,term,tdate) -- 此行可以省略此行可以省略此行可以省略 因为values依次对应的都是顺次对应的都是顺次对应的
5 values
6 (001,01,round(rand()*10,2),floor(rand()*1000),20190501),
7 (001,05,round(rand()*10,2),floor(rand()*1000),20190501),
8 (002,01,round(rand()*10,2),floor(rand()*1000),20190501),
9 (003,01,round(rand()*10,2),floor(rand()*1000),20190501),
10 (003,05,round(rand()*10,2),floor(rand()*1000),20190501),
11 (004,05,round(rand()*10,2),floor(rand()*1000),20190501),
12 (001,01,round(rand()*10,2),floor(rand()*1000),20190502),
13 (001,05,round(rand()*10,2),floor(rand()*1000),20190502),
14 (002,01,round(rand()*10,2),floor(rand()*1000),20190502),
15 (003,01,round(rand()*10,2),floor(rand()*1000),20190502),
16 (003,05,round(rand()*10,2),floor(rand()*1000),20190502),
17 (004,05,round(rand()*10,2),floor(rand()*1000),20190502)
18
19 select * from #a
20
21 select a.*,flag=case when b.symbol is not null and a.termb.datasource -- 注意关联条件注意关联条件
31
32 drop table #a
关键是连接条件on 不等号中的不等号
注意flag后面case when 中包含了许多含义
它分为以下几种情况:
1.能关联到b表 则如果a.term<b.term 则 行权 否则 到期
2.关联不到b表 那么它一定是到期的,那么一定是到期的
注意 这里a表中的所有数据都将以其原始形式返回 , b表的字段仅用于写入表字段仅用于写入表字段仅用于写入flag用于字段的辅助字段 ,就在这里,就是这里b表和a这张桌子是同一张桌子
最终返回的是最终返回的是最终返回的是a和b中的所有字段的所有字段 , 我们在select后面加上a.*过滤掉必填字段过滤掉必填字段过滤掉需要的字段过滤掉必填字段
ps:在实践中相同的代码两个现实中相同的代码两个相同的代码在实践中term它不会平等,不会平等,不会平等 这里使用的随机数有很小的相等概率 , 可以忽略
这种不平等的联系可以极大地提高对SQL了解链接查询了解相关性查询了解关联查询了解链接查询
谢谢!
转载于:https://www.cnblogs.com/chendongblog/p/10844389.html
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除