【各大软件公司NET工程师笔试压轴题】------不得不看

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

纵览各大社区、论坛,各大ORM框架火得不行了,如NHibernate、LINQtoSQL、ADO.NETEntityframework等,还有最近市场上出版的一本叫《领域驱动设计与模式实战》,里面也凸显了不少NHibernate在领域驱动设计中的作用与地位,也算是第一本与NHibernate相关的书籍吧!不过就NHibernate而言还是没有官方文档介绍得详细呵呵,园子里Kiler已经把他翻译成中文版的了,收益一大片仅仅是CET-4的人。不管你是用NHibernate也好,还是用LINQtoSQL也好,用profiler一跟踪,执行的都是SQL语句,所以所SQL是根。特别是对于那些以数据为中心的应用系统,在数据库中实现复杂的存储过程,复杂的报表查询,还是直接SQL来得痛快。当然对于那些在基于.NET的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,NHibernate是最有用的。不管怎样,NHibernate一定可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去(官方文档)。有点跑题了,不再啰嗦----直接晾出压轴题。压轴题第一问1.把表一转换为表二表一:表二:数据库代码如下:代码1DROPtable#student2CREATETABLE#student(stdnamenvarchar(10),stdsubjectnvarchar(10),resultint)3INSERTINTO#studentVALUES('张三','语文',80)4INSERTINTO#studentvalues('张三','数学',90)5INSERTINTO#studentVALUES('张三','物理',85)6INSERTINTO#studentVALUES('李四','语文',85)7INSERTINTO#studentvalues('李四','数学',92)8INSERTINTO#studentVALUES('李四','物理',82)9INSERTINTO#studentVALUES('李四','化学',82)10INSERTINTO#studentVALUES('李四','化学',82)11SELECT*FROM#student可能很多老手们,一看到这题目就有了答案。当然,贴出答案来不是我的目的,我要带着SQL新手们重构到答案。用李建忠老师最爱说的话就是------我不建议一上来就套用模式,而应该从重构到模式。首先大家会想到分两组1selectstdname,····,from#studentgroupbystdname然后······中间该写什么呢?代码1casestdsubjectwhen'化学'thenResultend2casestdsubjectwhen'语文'thenResultend3casestdsubjectwhen'···'thenResultend4casestdsubjectwhen'···'thenResultend5casestdsubjectwhen'···'thenResultend表二里面得0是哪里来的呢?代码1isnull(sum(casestdsubjectwhen'化学'thenResultend),0)2isnull(sum(casestdsubjectwhen'语文'thenResultend),0)3isnull(sum(casestdsubjectwhen'···'thenResultend),0)4isnull(sum(casestdsubjectwhen'···'thenResultend),0)5isnull(sum(casestdsubjectwhen'···'thenResultend),0)所以得出:代码1selectstdname,2isnull(sum(casestdsubjectwhen'化学'thenResultend),0)[化学],3isnull(sum(casestdsubjectwhen'数学'thenResultend),0)[数学],4isnull(sum(casestdsubjectwhen'物理'thenResultend),0)[物理],5isnull(sum(casestdsubjectwhen'语文'thenResultend),0)[语文]6from#student7groupbystdname然后得出答案:代码1declare@sqlvarchar(4000)2set@sql='selectstdname'3select@sql=@sql+',isnull(sum(casestdsubjectwhen'''+stdsubject+'''thenResultend),0)['+stdsubject+']'4from(selectdistinctstdsubjectfrom#student)asa5select@sql=@sql+'from#studentgroupbystdname'6print@sql7exec(@sql)8压轴题第二问:把表二转化为表一表一:表二:数据库代码如下:代码1DROPtable#student22CREATETABLE#student2(stdnamenvarchar(10),化学int,数学int,物理int,语文int)3INSERTINTO#student2VALUES('李四',164,92,82,85)4INSERTINTO#student2VALUES('张三',0,90,85,80)5SELECT*FROM#student2看到这题,直接想到:代码1SELECT'李四'asstdname,stdname='化学',化学asresultfrom#student2wherestdname='李四'2unionall3SELECT'李四'asstdname,stdname='数学',数学asresultfrom#student2wherestdname='李四'4unionall5SELECT'李四'asstdname,stdname='物理',物理asresultfrom#student2wherestdname='李四'6unionall7SELECT'李四'asstdname,stdname='语文',语文asresultfrom#student2wherestdname='李四'8unionall9SELECT'张三'asstdname,stdname='化学',化学asresultfrom#student2wherestdname='张三'10unionall11SELECT'张三'asstdname,stdname='数学',数学asresultfrom#student2wherestdname='张三'12unionall13SELECT'张三'asstdname,stdname='物理',物理asresultfrom#student2wherestdname='张三'14unionall15SELECT'张三'asstdname,stdname='语文',语文asresultfrom#student2wherestdname='张三'重构到:代码1declare@sql2varchar(4000)2set@sql2=''3SELECT@sql2=@sql2+4'SELECT'''+stdname+'''asstdname,stdname=''化学'',化学asresultfrom#student2wherestdname='''+stdname+'''5unionall6SELECT'''+stdname+'''asstdname,stdname=''数学'',数学asresultfrom#student2wherestdname='''+stdname+'''7unionall8SELECT'''+stdname+'''asstdname,stdname=''物理'',物理asresultfrom#student2wherestdname='''+stdname+'''9unionall10SELECT'''+stdname+'''asstdname,stdname=''语文'',语文asresultfrom#student2wherestdname='''+stdname+'''unionall'11from(SELECTstdnameFROM#student2)asa12SELECT@sql2=LEFT(@sql2,LEN(@sql2)-10)13PRINT(@sql2)14exec(@sql2)如果要求不能出现化学数学物理语文这样的关键字,那么可以这样写:代码1select[name]into#tmpCloumns2fromtempdb.dbo.syscolumns3whereid=object_id('tempdb.dbo.#student2')4and[name]'stdname'5select*from#tmpCloumns67declare@strSqlnvarchar(800)8select@strSql=''9select@strSql=@strSql+'unionall'+char(10)+char(13)+10'select[stdname],'''+[name]+'''as[科目],['+[name]+']'+char(10)+char(13)+11'from[#student2]'+char(10)+char(13)12from#tmpCloumns1314select@strSql=substring(@strSql,11,len(@strSql))+'orderbystdname,[科目]'15--print@strSql16exec(@strsql)这种题目,在各种笔试中出现的概率还是非常大的,大家不用死记。以前有的朋友看着复杂的报表查询,几百行SQL,望而生畏,然后说:这是哪个SQL超人写的啊!其实,谁一上来不可能写出那么长的SQL,也是慢慢重构--调试--重构-······

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功