日期:2014-05-20  浏览次数:20830 次

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 这里