1、先建立一个员工子女表B
1 create table B( 2 YG VARCHAR(20), --员工名 3 BB1 VARCHAR(20), --孩子1 4 BB2 VARCHAR(20), --孩子2 5 BB3 VARCHAR(20) --孩子3 6 ) 7 8 9 INSERT INTO B VALUES 10 ('赤井','一郎','二郎','三郎'), 11 ('工藤','春子','夏子',''), 12 ('铃木','夏子','',''), 13 ('吉田','','','')
2、查询结果如下
YG | BB1 | BB2 | BB3 |
赤井 | 一郎 | 二郎 | 三郎 |
工藤 | 春子 | 夏子 | |
铃木 | 夏子 | ||
吉田 |
3、通过 union all
1 SELECT yg,BB1 as bb FROM B 2 union all 3 SELECT yg,BB2 as bb FROM B 4 union all 5 SELECT yg,BB3 as bb FROM B
union all会将为空的列也查询出来,如果加上不为空的条件(<>'',因为插数据不是null所以用<>''),
就能查出所有有子女的员工及子女名,反之查询所有没小孩员工
4、有无子女员工全部查询,为了简化查询,创建视图查询所有小孩名去重非空
1 create view st(bb) 2 as select bb1 from B where bb1 <>'' 3 union 4 select BB2 from B where bb2 <>'' 5 union 6 select bb3 from B where bb3 <>''
5、然后用左连接left ,这样B表员工全部展现,子女没有就会为null展示
1 select b1.yg,st.bb from B b1 2 left join st 3 on st.bb in (b1.BB1,b1.bb2,b1.bb3) group by b1.yg,st.bb
查询结果如下
yg | bb |
赤井 | 二郎 |
赤井 | 三郎 |
赤井 | 一郎 |
工藤 | 春子 |
工藤 | 夏子 |
吉田 | NULL |
铃木 | 夏子 |
6、或者觉得NULL难看可以自定义NULL值
1 select b1.yg, 2 case when st.bb is null then '单身贵族' else st.bb end 列名 from B b1 3 left join st 4 on st.bb in (b1.BB1,b1.bb2,b1.bb3) group by b1.yg,st.bb