目录
示例数据表
源数据
name | birthday | joinday |
A | 1981 | 1991 |
B | 1981 | 1990 |
C | 1980 | 1991 |
D | 1981 | 1990 |
E | 1980 | 1990 |
结果表
name1 | name2 | birthday | joinday1 |
A | D | 1981 | 1 |
A | B | 1981 | 1 |
B | D | 1981 | 0 |
C | E | 1980 | 1 |
如图所示为某应聘者去国内某知名ERP软件公司面试的SQL题目。如何使用SQL语句将源数据表转化成结果表?
实例代码
SELECT A.name AS name1,B.name AS name2,A.birthday,(A.joinday-B.joinday) AS joinday1
FROM [sheet1$] A,[sheet1$] B
WHERE A.birthday=B.birthday AND A.name<B.name
ORDER BY A.name
通过字母大小比较连接工作表
通过效果图中列与列之间的关系可以发现:A与D之间的关系是birthday都为1981,说明birthday是A与D之间的连接桥梁。再从行与行之间的记录进行分析,发现name1字段的字母始终要比name2字段的字母要小,由此推出了另外一个连接条件:A.nameI<B.name2。若从效果图中推导出其关系,SQL语句即可迎刃而解。
本例中的SQL语句理解为:首先将worker表分别定义为不同的表A及表B,然后列出表A的name字段,并把其命名为name1;列出表B的name字段,并将其命名为name2;列出表A的birthday字段、表A的joinday字段与表B的joinday字段相减得到新字段joindayl,通过使用WHERE子句包含连接条件,其条件是表A的birthday等于表B的birthday字段,并且表A的name字段小于表B的name字段,‘最后通过ORDER BY子句统一排序。