Этот метод использует двоичную маску для выбора правильных строк:
;with src(t,n,p) as (
select element, index, power(2,index-1)
from table
)
select s1.t+s2.t+s3.t+s4.t
from src s1, src s2, src s3, src s4
where s1.p+s2.p+s3.p+s4.p=power(2,4)-1
Мой оригинальный пост:
declare @t varchar(4) = 'ABCD'
;with src(t,n,p) as (
select substring(@t,1,1),1,power(2,0)
union all
select substring(@t,n+1,1),n+1,power(2,n)
from src
where n < len(@t)
)
select s1.t+s2.t+s3.t+s4.t
from src s1, src s2, src s3, src s4
where s1.p+s2.p+s3.p+s4.p=power(2,len(@t))-1
Это одна из тех проблем, которые преследуют вас.Мне понравилась простота моего первоначального ответа, но была эта проблема, когда я все еще строил все возможные решения и затем выбирал правильные.Еще одна попытка сделать этот процесс более эффективным, только создав правильные решения, дала этот ответ.Добавляйте символ в строку, только если этот символ не существует в строке.Patindex казался идеальным компаньоном для решения CTE.Вот оно.
declare @t varchar(10) = 'ABCDEFGHIJ'
;with s(t,n) as (
select substring(@t,1,1),1
union all
select substring(@t,n+1,1),n+1
from s where n<len(@t)
)
,j(t) as (
select cast(t as varchar(10)) from s
union all
select cast(j.t+s.t as varchar(10))
from j,s where patindex('%'+s.t+'%',j.t)=0
)
select t from j where len(t)=len(@t)
Мне удалось построить все 3,6 миллиона решений за 3 минуты и 2 секунды.Надеюсь, это решение не будет пропущено только потому, что оно не первое.