【各大软件公司NET工程师笔试压轴题】------不得不看.docx
纵览各大大社区、论坛,各大OORM框框架火得得不行了了,如NNHibbernnatee、LIINQ to SQLL、ADDO.NNET Enttityy frrameeworrk等,还有最最近市场场上出版版的一本本叫领领域驱动动设计与与模式实实战,里面也也凸显了了不少NNHibbernnatee在领域域驱动设设计中的的作用与与地位,也算是是第一本本与NHHibeernaate相相关的书书籍吧!不过就就NHiiberrnatte而言言还是没没有官方方文档介介绍得详详细呵呵呵,园子子里Kiilerr已经把把他翻译译成中文文版的了了,收益益一大片片仅仅是是CETT-4的的人。不不管你是是用NHHibeernaate也也好,还还是用LLINQQ too SQQL也好好,用pproffileer一跟跟踪,执执行的都都是SQQL语句句,所以以所SQQL是根根。特别别是对于于那些以以数据为为中心的的应用系系统,在在数据库库中实现现复杂的的存储过过程,复复杂的报报表查询询,还是是直接SSQL来来得痛快快。当然然对于那那些在基基于.NNET的的中间层层应用中中,它们们实现面面向对象象的业务务模型和和商业逻逻辑的应应用,NNHibbernnatee是最有有用的。不管怎怎样,NNHibbernnatee一定可可以帮助助你消除除或者包包装那些些针对特特定厂商商的SQQL代码码,并且且帮你把把结果集集从表格格式的表表示形式式转换到到一系列列的对象象去(官官方文档档)。 有有点跑题题了,不不再啰嗦嗦-直接接晾出压压轴题。压轴题第第一问1.把表表一转换换为表二二表一: 表二:数据库代代码如下下:代码 1 DDROPP taablee #sstuddentt 2 CREEATEE TAABLEE #sstuddentt (sstdnnamee nvvarccharr(100),sstdssubjjectt nvvarccharr(100),rresuult intt) 3 INSSERTT INNTO #sttudeent VALLUESS (''张三'','语文文',80) 4 INSSERTT INNTO #sttudeent valluess (''张三'','数学学',90) 5 INSSERTT INNTO #sttudeent VALLUESS (''张三'','物理理',85) 6 INSSERTT INNTO #sttudeent VALLUESS (''李四'','语文文',85) 7 INSSERTT INNTO #sttudeent valluess (''李四'','数学学',92) 8 INSSERTT INNTO #sttudeent VALLUESS (''李四'','物理理',82) 9 INSSERTT INNTO #sttudeent VALLUESS (''李四'','化学学',82)10 INSSERTT INNTO #sttudeent VALLUESS (''李四'','化学学',82)11 SELLECTT * FROOM #stuudennt 可能很很多老手手们,一一看到这这题目就就有了答答案。当当然,贴贴出答案案来不是是我的目目的,我我要带着着SQLL新手们们重构到到答案。用李建建忠老师师最爱说说的话就就是-我不不建议一一上来就就套用模模式,而而应该从从重构到到模式。首先大家家会想到到分两组组1 seelecct sstdnnamee,·····,froom #stuudennt ggrouup bby sstdnnamee 然后········中间间该写什什么呢?代码 1 caase stddsubbjecct wwhenn '化化学' theen RResuult endd2 caase stddsubbjecct wwhenn '语语文' theen RResuult endd3 caase sstdssubjjectt whhen '····' theen RResuult endd4 caase stddsubbjecct wwhenn '····'' thhen Ressultt ennd5 casse sstdssubjjectt whhen '····' theen RResuult endd 表二里面面得0是是哪里来来的呢?代码 1 issnulll(ssum(casse sstdssubjjectt whhen '化学学' tthenn Reesullt eend),0)2 issnulll(ssum(casse sstdssubjjectt whhen '语文文' tthenn Reesullt eend),0)3 issnulll(ssum(casse sstdssubjjectt whhen '····' theen RResuult endd),00)4 issnulll(ssum(casse sstdssubjjectt whhen '····' theen RResuult endd),00)5 issnulll(ssum(casse sstdssubjjectt whhen '····' theen RResuult endd),00) 所以得出出:代码 1 seelecct sstdnnamee,2 isnnulll(suum(ccasee sttdsuubjeect wheen ''化学'' thhen Ressultt ennd),0) 化学,3 isnnulll(suum(ccasee sttdsuubjeect wheen ''数学'' thhen Ressultt ennd),0) 数学,4 isnnulll(suum(ccasee sttdsuubjeect wheen ''物理'' thhen Ressultt ennd),0) 物理,5 isnnulll(suum(ccasee sttdsuubjeect wheen ''语文'' thhen Ressultt ennd),0) 语文 6 froom #stuudennt 77 grooup by stddnamme 然后得出出答案:代码 1 deeclaare sqql vvarccharr(40000) 2 sett ssql = ''sellectt sttdnaame'' 3 sellectt ssql = sqll + ',iisnuull(summ(caase stddsubbjecct wwhenn ''''+sstdssubjjectt+'''' tthenn Reesullt eend),0) ''+sttdsuubjeect+''' 4 froom (sellectt diistiinctt sttdsuubjeect froom #stuudennt) as aa 5 sellectt ssql = sqll+' froom #stuudennt ggrouup bby sstdnnamee' 6 priint sqql7 exeec(sqll)8 压轴题第第二问:把表二二转化为为表一表一:表二:数据库代代码如下下:代码 1 DRROP tabble #sttudeent222 CREEATEE TAABLEE #sstuddentt2 (stddnamme nnvarrchaar(110),化学 intt,数学学 innt,物物理 iint ,语文文 innt )3 INSSERTT INNTO #sttudeent22 VAALUEES ('李四四',1644,92,82,85)4 INSSERTT INNTO #sttudeent22 VAALUEES ('张三三',0,90,85,80)5 SELLECTT * FROOM #stuudennt2 看到这题题,直接接想到: 代码 1 SSELEECT''李四''as sstdnnamee,sttdnaame='化学学', 化学 as rresuult froom #stuudennt2 wheere stddnamme=''李四'' 2 uniion alll 3 SELLECTT'李四四'ass sttdnaame,stddnamme=''数学'', 数数学 aas rresuult froom #stuudennt2 wheere stddnamme=''李四'' 4 uniion alll 5 SELLECTT'李四四'ass sttdnaame,stddnamme=''物理'', 物物理 aas rresuult froom #stuudennt2 wheere stddnamme=''李四'' 6 uniion alll 7 SELLECTT'李四四'ass sttdnaame,stddnamme=''语文'', 语语文 aas rresuult froom #stuudennt2 wheere stddnamme=''李四'' 8 uunioon aall 9 SELLECTT'张三三'ass sttdnaame,stddnamme=''化学'', 化化学 aas rresuult froom #stuudennt2 wheere stddnamme=''张三''10 uniion alll11 SELLECTT'张三三'ass sttdnaame,stddnamme=''数学'', 数数学 aas rresuult froom #stuudennt2 wheere stddnamme=''张三''12 uniion alll13 SELLECTT'张三三'ass sttdnaame,stddnamme=''物理'', 物物理 aas rresuult froom #stuudennt2 wheere stddnamme=''张三''14 uniion alll15 SELLECTT'张三三'ass sttdnaame,stddnamme=''语文'', 语语文 aas rresuult froom #stuudennt2 wheere stddnamme=''张三'' 重构到到:代码 1 ddecllaree ssql22 vaarchhar(40000) 2 sett ssql22 = '' 3 SELLECTT ssql22=ssql22+ 4 'SEELECCT''''+sstdnnamee+''''ass sttdnaame,stddnamme='''化学学'', 化学学 ass reesullt ffromm #sstuddentt2 wwherre sstdnnamee=''''+sstdnnamee+'''' 55 uniion alll 6 SELLECTT''''+sttdnaame+''''as sstdnnamee,sttdnaame=''数学学'', 数学 as rresuult froom #stuudennt2 wheere stddnamme=''''+stddnamme+'''' 7 uniion alll 8 SELLECTT''''+sttdnaame+''''as sstdnnamee,sttdnaame=''物理理'', 物理 as rresuult froom #stuudennt2 wheere stddnamme=''''+stddnamme+'''' 9 uniion alll10 SELLECTT''''+sttdnaame+''''as sstdnnamee,sttdnaame=''语文文'', 语文 as rresuult froom #stuudennt2 wheere stddnamme=''''+stddnamme+'''' uniion alll '11 froom (SELLECTT sttdnaame FROOM #stuudennt2) ass a122 SELLECTT ssql22 = LEFFT(sqll2,LLEN(sqql2) - 10)13 PRIINT(sqql2)14 exeec(sqll2) 如果要求求不能出出现 化学 数学学 物物理 语语文 这这样的关关键字,那么可可以这样样写:代码 1 sseleect naame innto #tmmpClloummns 2 froom ttemppdb.dboo.syyscoolummns 3 wheere id=objjectt_idd('ttemppdb.dboo.#sstuddentt2') 4 andd nnamee<>>'sttdnaame'' 5 sellectt * frrom #tmmpClloummns 6 7 decclarre strrSqll nvvarccharr(8000) 8 sellectt sstrSSql='' 99 sellectt sstrSSql=sttrSqql+''uniion alll'+chaar(10)+chaar(13)+10 'sseleect sttdnaame,''''+namme+'''' ass 科科目,'+naame+''+chaar(10)+chaar(13)+11 'ffromm #stuudennt2'+chaar(10)+chaar(13)12 froom #tmppClooumnns133 14 sellectt sstrSSql=subbstrringg(sstrSSql,11,llen(sttrSqql)+'oordeer bby sstdnnamee,科科目''15 -pprinnt strrSqll16 exeec(strrsqll) 这种题题目,在在各种笔笔试中出出现的概概率还是是非常大大的,大大家不用用死记。以前有有的朋友友看着复复杂的报报表查询询,几百百行SQQL,望望而生畏畏,然后后说:""这是哪哪个SQQL超人人写的啊啊!"其其实,谁谁一上来来不可能能写出那那么长的的SQLL,也是是慢慢重重构-调试-重构构-········