问题描述
今天去明源面试了下面是个SQL题目,我做完之后改卷子的人说我思路不清晰,水平差的一踏糊涂。哎做题没动脑筋怎么简单怎么写好长时间没写SQL了。大家看看我写的是错的吗?我回来上机搞了下答案是对的方法麻烦了点。麻烦你说清楚啊不能使用游标啊高考解题目还限制不能使用什么方法吗?A学生表IDNameageRank1李11202李23303李33204李43405李53606李63707李73808李83909李9400B分数表IDsubjectscore4语文884数学675语文885数学676语文886数学647语文658数学679语文7210数学731.)统计每门功课前三名学生的ID,name,subject,score?下面是我写的没动脑筋写的DECLARE@subjectVARCHAR(50)DECLAREtempCurSorCURSORFORSELECTDISTINCTsubjectFROMdbo.BOPENtempCurSorFETCHNEXTFROMtempCurSorINTO@subjectWHILE(@@FETCH_STATUS=0)BEGINselecttop3A.ID,A.Name,B.subject,B.scorefromAleftjoinBonA.ID=B.IDANDB.subject=@subjectorderbyscoreDESCFETCHNEXTFROMtempCurSorINTO@subjectENDCLOSEtempCurSorDEALLOCATEtempCurSor
解决方案
解决方案二:
我这答案是个错的吗蛋疼看来理念不同。难道你们觉得所有的东西都要把底层写出来吗?那有.NET搞毛直接用C开发网站啊...................................
解决方案三:
最新的技术都用NOSQL了,他们还在强调SQL,等着淘汰吧
解决方案四:
这样的题目有什么意义?这样的公司在北京是没市场的,只有在武汉这个地方摧残那些人而已
解决方案五:
AleftjoinB还是ArightjoinB?这个你需要改变测试数据,再测试一下。一般来说,面试时要求你使用1、2条SQL语句来得到查询结果(使用2条语句,那么第一条可以创建一个“临时表”)。这样的要求比较容易看出逻辑表达能力。其实你的程序逻辑是没有什么问题的,一点也看不出“思路不清晰,水平差的一踏糊涂”的迹象。只是使用游标会让程序臃肿和阅读起来费时间而已。
解决方案六:
估计,面试官想看到row_number()函数被使用,或者想看到where(selectcount(*)from...astwheret.subject=B.subjectandt.score>B.score)<3被使用,这类的sql语句。实际上这个问题,如果允许使用游标,那么使用游标其实“很合适”。假设你使用“客户端驱动”从客户端去操作数据库,那么使用游标会在客户端与服务器端传送巨大量的消息,而且这个缓慢的过程中还锁住了服务器端,使得“一个客户端查询快了微不足道的一点,但是多用户查询的整体效率降低”。因为它极易如此,所以一般来说我们“禁止”普通程序员使用游标。如果我写这种程序,我可能宁可“笨一点”,先把SELECTDISTINCTsubjectFROMdbo.B查询到应用程序中,然后再循环查询每一个课程的前三名。
解决方案七:
出这样的SQL题目能反应什么问题?与.NET有毛关系?
解决方案八:
出这样的题目,不如搞几个微积分的题目来的实在
解决方案九:
引用7楼jhdxhj的回复:
出这样的题目,不如搞几个微积分的题目来的实在
他们搞房地产的说SQL是门槛写不好就可以滚蛋了!
解决方案十:
引用5楼sp1234的回复:
估计,面试官想看到row_number()函数被使用,或者想看到where(selectcount(*)from...astwheret.subject=B.subjectandt.score>B.score)<3被使用,这类的sql语句。实际上这个问题,如果允许使用游标,那么使用游标其实“很合适”。假设你使用“客户端驱动”从客户端去操作数据库,那么使用游标会在客户端与服务器端传送巨大量的消息,而且这个缓慢的过程中还锁住了服务器端,使得“一个客户端查询快了微不足道的一点,但是多用户查询的整体效率降低”。因为它极易如此,所以一般来说我们“禁止”普通程序员使用游标。如果我写这种程序,我可能宁可“笨一点”,先把SELECTDISTINCTsubjectFROMdbo.B查询到应用程序中,然后再循环查询每一个课程的前三名。
我又写了个答案selectdistinctt1.*fromBt1wheret1.idin(selecttop3B.idfromBINNERJOINaONa.id=B.idwheresubject=t1.subjectorderbyscoredesc)orderbyt1.subject这是想了好半天的哎!!他们只要求SQL写的好的。