Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Заклинило с рекурсивным СТЕ.  [new]
smallserg
Member

Откуда:
Сообщений: 82
Есть
declare @t table (nn varchar(10))

insert into @t (nn)  values ('aaaa')
insert into @t (nn)  values ('bbbb')
insert into @t (nn)  values ('cccc')
insert into @t (nn)  values ('dddd')


Пытаюсь получить все возможные комбинации в виде :
  1   aaaa
1	bbbb
1	cccc
1     dddd
2     bbbb
2     cccc
2     dddd
3     aaaa
3     cccc
3     dddd
4     aaaa
4     bbbb
4     dddd
5     aaaa
5     bbbb
5     cccc
6     aaaa
6     bbbb
7     aaaa
7     cccc
8     aaaa
8     dddd
9     bbbb
9     cccc
10    bbbb
10    dddd
11    cccc
11    dddd
12    aaaa
13    bbbb
14    cccc 
15    dddd


Делаю :
;with ct as
(select nn,row_number() over (order by (select 1)) rn from @t)
, it as
( select nn,rn,1 n from  ct
  union all
  select  it.nn,it.rn,n+1 from  it  join  ct  on it.rn>=n and n<4)

select * from it order by n



Получаю ..... фих. Ткните, плиз ...
10 июл 12, 12:30    [12843884]     Ответить | Цитировать Сообщить модератору
 Re: Заклинило с рекурсивным СТЕ.  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
smallserg,

посмотрите это, например: 4418874
10 июл 12, 12:46    [12843996]     Ответить | Цитировать Сообщить модератору
 Re: Заклинило с рекурсивным СТЕ.  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
Фактически, Вам же надо, чтобы было так?

a___
_b__
__c_
___d
ab__
a_c_
a__d
_bc_
_b_d
__cd
abc_
ab_d
a_cd
_bcd
abcd

иначе говоря:

abcd
----
1000
0100
0010
0001
1100
1010
1001
0110
0101
0011
1110
1101
1011
0111
1111

Что-то такое по ссылке, которую я тут вспомнил, и делается
10 июл 12, 12:55    [12844057]     Ответить | Цитировать Сообщить модератору
 Re: Заклинило с рекурсивным СТЕ.  [new]
smallserg
Member

Откуда:
Сообщений: 82
Нет , не так. Количество строк - не определено.
Это нужно для решения "задачи о рюкзаке".
Т.е. какие комбинации элементов мы можем в него
впихнуть по определенному критерию.
10 июл 12, 13:07    [12844133]     Ответить | Цитировать Сообщить модератору
 Re: Заклинило с рекурсивным СТЕ.  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
smallserg
Нет , не так. Количество строк - не определено.
Ничего не понял.
А в первом посте тогда что? Ещё комбинации пронумерованы - из одной буквы, из двух, из трёх, из четырёх...
10 июл 12, 13:14    [12844188]     Ответить | Цитировать Сообщить модератору
 Re: Заклинило с рекурсивным СТЕ.  [new]
smallserg
Member

Откуда:
Сообщений: 82
declare @t table (nn varchar(10))

insert into @t (nn)  values ('a')
insert into @t (nn)  values ('b')
insert into @t (nn)  values ('c')
insert into @t (nn)  values ('d')


Количество возможных комбинаций - 15
Первая комбинация :
1 a
1 b
1 c
1 d

Вторая комбинация :
2 b
2 c
2 d

Третья :

3 a
3 c
3 d

и так до пятнадцатой. При этом в исходной таблице @t может
быть от 1 до 20 строк
10 июл 12, 13:22    [12844255]     Ответить | Цитировать Сообщить модератору
 Re: Заклинило с рекурсивным СТЕ.  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
smallserg
declare @t table (nn varchar(10))

insert into @t (nn)  values ('a')
insert into @t (nn)  values ('b')
insert into @t (nn)  values ('c')
insert into @t (nn)  values ('d')


Количество возможных комбинаций - 15
Первая комбинация :

1   a
1 b 1111
1 c
1 d

Вторая комбинация :

2  b
2 c 0111
2 d
Третья :

3  a
3 c 1011
3 d

и так до пятнадцатой. При этом в исходной таблице @t может
быть от 1 до 20 строк
И чему это противоречит (см мои дополнения)
10 июл 12, 13:31    [12844350]     Ответить | Цитировать Сообщить модератору
 Re: Заклинило с рекурсивным СТЕ.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
+ Небольшой говнокодик
DECLARE @Table TABLE (
	 Value	VarChar(10) PRIMARY KEY
)INSERT	@Table (Value) VALUES
 ('AAAA')
,('BBBB')
,('CCCC')
,('DDDD')

;WITH Comb AS (
	SELECT	 Value
		,1						AS N
		,Convert(VarChar(max),'<C>' + Value + '</C>')	AS Comb
	FROM	@Table
UNION ALL
	SELECT	 R.Value
		,L.N + 1
		,L.Comb + '<C>' + R.Value + '</C>'
	FROM	      Comb	L
		JOIN  @Table	R ON R.Value > L.Value
), XComb AS (
	SELECT	 Row_Number()OVER(ORDER BY N DESC,Comb)	AS N
		,Convert(XML,Comb)			AS XComb
	FROM	Comb
)	SELECT	 C.N
		,X.C.value('.','VarChar(10)')
	FROM	XComb C CROSS APPLY XComb.nodes('C')X(C)
10 июл 12, 16:29    [12845995]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить