解决方法
那么这里是我的解决方案(
sqlfiddle) – 它的目的是使用一个“关系sql”操作,这可能是面试官在概念上所做的.
所做的大部分工作只是将字符串转换成一组(pos,letter)记录,因为相关的最终应用DQL只是一个使用分组和排序的SELECT.
select letter from ( -- All of this just to get a set of (pos,letter) select ns.n as pos,substring(ss.s,ns.n,1) as letter from (select 'MANHATTAN' as s) as ss cross join ( -- Or use another form to create a "numbers table" select n from (values (1),(2),(3),(4),(5),(6),(7),(8),(9)) as X(n) ) as ns ) as pairs group by letter -- guarantees distinctness order by min(pos) -- ensure output is ordered MANHT
上述查询在sql Server 2008中可用,但“Numbers Table”可能需要针对其他供应商进行更改.否则,没有什么用的是供应商特定的 – 没有CTE,或交叉应用功能,或程序语言代码.
话虽如此,上面是展示一种概念性的方法 – sql被设计为用于集合和关系以及跨越记录的多重性;在某种意义上,上述例子只是这样的歪曲.
检查中间关系,
select ns.n as pos,1) as letter from (select 'MANHATTAN' as s) as ss cross join ( select n from (values (1),(9)) as X(n) ) as ns
使用cross join生成带有数字(9行)的字符串(1行)的笛卡尔乘积;然后使用字符串和每个数字应用子字符串函数,以根据其位置获取每个字符.结果集包含记录 –
POS LETTER 1 M 2 A 3 N .. 9 N
然后,外部选择根据字母对每个记录进行分组,并且生成的记录按照建立分组的字母的最小(第一)出现位置排序. (没有信件的顺序将是不同的,但最终的订单将不会得到保证.)