SQL试题测验 - 你可以试试
新公司有些忙,都很久没来逛CSDN了 更别说发帖了。
上周5做了一下公司每三个月一考的试题。
关于SQL相关的在这儿说说:
填空题中有一SQL题:
查询出表T的字段column1(nvarchar)中"@"出现的次数--写出SQL
PS:个人看到这个题后想了常用的字符操作函数后,觉得这个至少可以用动态SQL搞定。但作为一个填空题又否定了这种思路。(知道的coder们可以先别那么急说出来 看其他的coder们自己多想想,平时的编程都做什么去了)
正式的SQL试题中
1.查询订单详情数据
订单详细表 Order_Detail
细节略去要的效果如:
订单编号 产品
123 产品A,产品B,产品C
这个题自己一年前就因为一个项目想偷懒也用了这样的查询SQL 在论坛里也回复过这个题如何去实现。(这个至少要用一个系统方法,不是很常用,而且效率并不高,后期项目里也替换成了常规处理方式。)
2.产品类别表Category
CategoryID_int CategoryName_nvarchar ParentID_int
1 产品分类1 0
2 产品分类2 1
3 产品分类3 1
4 产品分类4 2
5 产品分类5 4
………………
要求实现:
分类名 类别路径描述
产品分类5 产品分类1--产品分类2--产品分类4
此题若换成一个程序实现,绝大部分coder都能实现,但这儿要用SQL去实现 涉及到一个表达式
同样也是一个思路 但平常项目中也用到 只是没在意它对于的专业术语
另外一道题是上述2题的融合统计查询就不在写了
对于这次考试,没平时的积累,60分钟估计也就能做1/2。正确率那也就更不提了。
对于这种方式,也算是一种的培训。况且每次考试都对应着自己的评级(笔试机试共占40%)
好了 后面几句是唠叨 coder们试试吧
------解决方案-------------------- http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/09ba07fb-209c-462c-a5b6-88574e575a4b/
作为一个coder,知道怎么搜索就可以了。
google sql recursive tree path
------解决方案-------------------- 引用: Quote: 引用:
http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/09ba07fb-209c-462c-a5b6-88574e575a4b/
作为一个coder,知道怎么搜索就可以了。
google sql recursive tree path
曹斑竹 不带这么干的
另外个人觉得第一题没那么麻烦的 只是要求你找到出现了多少次而已
第一题确实不麻烦,可以用sql 正则处理
------解决方案-------------------- 好吧,打酱油
------解决方案-------------------- 碉堡!第二题好实用哦!
------解决方案-------------------- 图森破。。。
------解决方案-------------------- 引用: 第一题:最简单的思路就用替换 将“@”替换成“” 然后用原来的长度减去替换后的长度即可得到出现次数
第二题:用stuff( (select ','+产品名 from 产品详细表 where **** for xml path('')),1,1'')
for xml path('') 组合查询出的数据成“,产品1,产品2,产品3……”的样式 stuff去掉第一个“,”
第三题:CTE 递归
WITH 公用表表达式(列名1,列名2,列名3)
AS
(
SELECT 列名1,列名2,列名3.. FROM 表 --定位点成员
UNION ALL
SELECT 列名1,列名2,列名3..FROM 表, 公用表表达式 --递归成员
)
递归CTE 的执行过程大致如下:
将CTE拆分为定位点成员和递归成员
运行定位点成员,创建第一个调用或基准结果集(R1), 递归级数 i = 1;
运行递归成员, 将Ri作为输入,将Ri+1 作为输出, 然后 i 递增 1, 变为 2;
重复步骤 3, 直到返回空集;
返回结果集. 结果集为 R1 到 Ri 进行 UNION ALL 的结果.
第二题,实现的方法很多,LZ的方法是sql2005以上才支持xml的写法,
方法收集
http://bbs.csdn.net/topics/340164913
------解决方案-------------------- 第三题用递归CTE是没问题的
第一题,你的方法是最常规的,也是最好的。@替换为"",再统计长度之差
------解决方案-------------------- 我在用数据库执行计算一个问题,明天给结果
------解决方案-------------------- 引用: 我在用数据库执行计算一个问题,明天给结果
好几天了都
declare @a int,@b int,@c int,@d varchar(20) --@a 循环起始变量 @b 数据行数 @c 1的个数 @d 列值
set @a=1;set @c=0;
select @b=COUNT(url) from Table_3 where url like '%1%'
while(@a<=@b)
begin
select top(@a)@d=url from Table_3 where url like '%1%'
print '@d='+cast(@d as varchar(200))
set @c=@c+len(@d)-len(replace(@d,'1',''));
print 'a='+cast(@a as varchar(10))
set @a=@a+1;
end
print '包含1的个数'+cast(@c as varchar(20))
数据库
结果图
------解决方案-------------------- free SQL exercises 这里