多条件Left Outer Table Join实现:两表左外连接需求及示例
多条件Left Outer Join实现方案
我来帮你搞定这个基于多条件的左外连接需求!先理清楚两张原始表的情况,再给出对应的SQL语句和预期结果。
原始表数据
First Table
| Id | RenewalTerm | EffectiveDt | RenewalDt |
|---|---|---|---|
| 400001 | -1 | 8/1/2012 | 8/1/2013 |
| 400001 | 0 | 8/1/2013 | 8/1/2014 |
| 400001 | 1 | 8/1/2014 | 8/1/2015 |
| 400001 | 2 | 8/1/2015 | 8/1/2016 |
| 400001 | 3 | 8/1/2016 | 8/1/2017 |
| 400001 | 4 | 8/1/2017 | 8/1/2018 |
SecondTable
| Id | RenewalTerm | MaxSize | AY | DateTime | EffectiveDt | RenewalDt |
|---|---|---|---|---|---|---|
| 400001 | -1 | 2 | 2013 | 2/25/2013 | 8/1/2012 | 8/1/2013 |
| 400001 | -1 | 1.75 | 2013 | 2/25/2013 | 8/1/2012 | 8/1/2013 |
| 400001 | 2 | 1.75 | 2016 | 5/1/2016 | 8/1/2015 | 8/1/2016 |
左外连接SQL语句
我们需要基于Id、RenewalTerm、EffectiveDt和RenewalDt这四个字段做匹配,执行左外连接来保留FirstTable的所有行,同时关联SecondTable中符合条件的数据:
SELECT ft.Id, ft.RenewalTerm, ft.EffectiveDt, ft.RenewalDt, st.MaxSize, st.AY, st.DateTime FROM FirstTable ft LEFT OUTER JOIN SecondTable st ON ft.Id = st.Id AND ft.RenewalTerm = st.RenewalTerm AND ft.EffectiveDt = st.EffectiveDt AND ft.RenewalDt = st.RenewalDt;
预期连接结果(Expected Table Result)
执行上面的SQL后,会得到如下结果:
| Id | RenewalTerm | EffectiveDt | RenewalDt | MaxSize | AY | DateTime |
|---|---|---|---|---|---|---|
| 400001 | -1 | 8/1/2012 | 8/1/2013 | 2 | 2013 | 2/25/2013 |
| 400001 | -1 | 8/1/2012 | 8/1/2013 | 1.75 | 2013 | 2/25/2013 |
| 400001 | 0 | 8/1/2013 | 8/1/2014 | NULL | NULL | NULL |
| 400001 | 1 | 8/1/2014 | 8/1/2015 | NULL | NULL | NULL |
| 400001 | 2 | 8/1/2015 | 8/1/2016 | 1.75 | 2016 | 5/1/2016 |
| 400001 | 3 | 8/1/2016 | 8/1/2017 | NULL | NULL | NULL |
| 400001 | 4 | 8/1/2017 | 8/1/2018 | NULL | NULL | NULL |
这里要注意:FirstTable中RenewalTerm=-1的行在SecondTable中有两条匹配数据,所以会生成两行结果;RenewalTerm=2的行有一条匹配;其余没有匹配的行,SecondTable对应的字段会显示NULL,这正是左外连接的核心特性——完整保留左表的所有记录。
内容的提问来源于stack exchange,提问作者Jatin Garg
相关产品推荐
相关产品推荐

