leetcode数据库类型:181.超过经理收入的员工,难度:简单
解答:
1、使用自联结
说实话第一眼看这个题目,没看懂0.0,仔细看了看才明白,Employee表中的name是全部姓名列,包含员工和经理,而managerId列是经理的编号,翻译过来就是第一行Joe的经理编号是3=Sam,第二行Henry的经理编号是4=Max,第三、四行是经理所以在第四列没有值。那就可以开始想了,题目是查出salary比经理要高的员工,这种比***高的题目基本都是联结题,这道题就是自联结。
上表是自联结后的表,产生了笛卡尔积(笛卡尔积又称直积,表示为X*Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员,假设集合A={a,b},集合B={0,1,2,},则这两个集合的笛卡尔积为{(a,0)、(a,1)、(a,2)、(b,0)、(b,1)、(b,2)}),本题中,会产生4*4=16行记录,其中前4列为a表,记录的是员工信息包含经理(经理也属于员工啊),后四列为b表,也可看成是员工表,只不过表现形式不同,第一种方法难理解的就是a.ManagerId = b.Id这句吧,这个我也想了一会哦,其实把上面的表看懂就行了,a.ManagerId就是员工的经理编号,b.Id也是经理编号,照着表对一下就明白了。
2、使用子查询
子查询也可实现第一种方法的结果,只不过子查询的时间要长一些,Ted看了一下,要长4倍多,作为后备方法,知道可以这么写就行了,具体用哪种,看你们个人习惯吧。