SQL 用外连接进行行列转换(列→行):汇总重复项于一列

本文讲解了如何通过在SQL中使用CREATE VIEW和LEFT OUTER JOIN创建视图,以展示Personnel表中员工及其子女信息,包括处理NULL值。重点在于理解IN操作符在连接子视图时的应用。
摘要由CSDN通过智能技术生成

源表:
在这里插入图片描述目标表:
在这里插入图片描述
源表建表代码:

CREATE TABLE Personnel
 (employee   varchar(32), 
  child_1    varchar(32), 
  child_2    varchar(32), 
  child_3    varchar(32), 
  PRIMARY KEY(employee));

INSERT INTO Personnel VALUES('赤井', '一郎', '二郎', '三郎');
INSERT INTO Personnel VALUES('工藤', '春子', '夏子', NULL);
INSERT INTO Personnel VALUES('铃木', '夏子', NULL,   NULL);
INSERT INTO Personnel VALUES('吉田', NULL,   NULL,   NULL);

解题思路:
先建立子女列表的视图,再以员工列表为主表进行外连接操作。

CREATE VIEW Children(child)
AS SELECT child_1 FROM Personnel
   UNION
   SELECT child_2 FROM Personnel
   UNION
   SELECT child_3 FROM Personnel;
   
/* 获取员工子女列表的SQL语句(没有孩子的员工也输出) */
SELECT EMP.employee, CHILDREN.child
FROM Personnel EMP
LEFT OUTER JOIN Children
ON CHILDREN.child IN (EMP.child_1, EMP.child_2, EMP.child_3);

当表 Personnel 里“孩子 1~孩子 3”列的名字存在于 Children 视图里时,返回该名字,否则返回 NULL。

对上述谓词in的用法不是很理解,有懂的大佬,还望指点一二。

——————
参考资料:《SQL进阶教程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值