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

Откуда:
Сообщений: 148
пусть есть таблица
create table #tt (a int);
insert into #tt values (1),(2),(3);


то есть, есть таблица:
1
2
3

хочется же получить таблицу
ID-Value
1-1
1-2
1-3
2-1
2-3
2-2
3-2
3-1
3-3
.
.
.
6-3
6-2
6-1
13 апр 12, 17:34    [12413633]     Ответить | Цитировать Сообщить модератору
 Re: получить все перестановки в ту же таблицу  [new]
iljy
Member

Откуда:
Сообщений: 8711
Шпунтик,

а откуда взялось 6? А так - CROSS JOIN
13 апр 12, 17:36    [12413655]     Ответить | Цитировать Сообщить модератору
 Re: получить все перестановки в ту же таблицу  [new]
Шпунтик
Member

Откуда:
Сообщений: 148
iljy,

число перестановок из трёх элементов
13 апр 12, 17:39    [12413668]     Ответить | Цитировать Сообщить модератору
 Re: получить все перестановки в ту же таблицу  [new]
Шпунтик
Member

Откуда:
Сообщений: 148
iljy,

и что даст cross join?
понятно, что можно дико извращаться и собирать сначала эту таблицу в виде
ID-Value1-Value2-Value3,
но в общем случае число переменных будет неизвестно ({1,2,3,....,n})

и даже тут можно собрать запрос в varchar'е

но хочется красивого решения проблемы)
13 апр 12, 17:42    [12413683]     Ответить | Цитировать Сообщить модератору
 Re: получить все перестановки в ту же таблицу  [new]
iljy
Member

Откуда:
Сообщений: 8711
Шпунтик,

а, понял, чего вы хотите. Можно так:
declare @t table (a int);
insert into @t values (1),(2),(3);

;with cte as(
	select 1 l, cast('-' + CAST(a as varchar) as varchar(max)) val
	from @t
		union all
	select l+1, c.val + '-' + CAST(a as varchar)
	from @t t join cte c on val + '-' not like '%-' + CAST(a as varchar) + '-%' 

)
select SUBSTRING(val, 2, 8000) val from cte where l = 3
13 апр 12, 17:45    [12413699]     Ответить | Цитировать Сообщить модератору
 Re: получить все перестановки в ту же таблицу  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Шпунтик,
declare @tt table  (a int);
insert into @tt values (1),(2),(3);

select cast(t1.a as varchar(3)) +'-'+ cast(t2.a as varchar(3)) as ss
from @tt t1, @tt t2
order by t1.a
13 апр 12, 17:58    [12413754]     Ответить | Цитировать Сообщить модератору
 Re: получить все перестановки в ту же таблицу  [new]
Шпунтик
Member

Откуда:
Сообщений: 148
Шпунтик,

чото я, кстати, хрень какую-то написал, нужно же ещё поле для порядка в перестановке, типа
ID|order|Value
+
1|1|1
1|2|2
1|3|3
2|1|1
2|2|3
2|2|2
3|1|2
3|2|1
3|3|3
4|1|2
4|2|3
4|3|1
5|1|3
5|2|1
5|3|2
6|1|3
6|2|2
6|3|1
13 апр 12, 18:10    [12413803]     Ответить | Цитировать Сообщить модератору
 Re: получить все перестановки в ту же таблицу  [new]
Шпунтик
Member

Откуда:
Сообщений: 148
fix
+
+

1|1|1
1|2|2
1|3|3
2|1|1
2|2|3
2|3|2
3|1|2
3|2|1
3|3|3
4|1|2
4|2|3
4|3|1
5|1|3
5|2|1
5|3|2
6|1|3
6|2|2
6|3|1
[/quot]
13 апр 12, 18:11    [12413810]     Ответить | Цитировать Сообщить модератору
 Re: получить все перестановки в ту же таблицу  [new]
Шпунтик
Member

Откуда:
Сообщений: 148
Шпунтик,

ну и чтобы не вводило в заблуждение сделаем так:
('a'),('b'),('c')

1|1|a
1|2|b
1|3|c
2|1|a
2|2|c
2|2|b
3|1|b
3|2|a
3|3|c
4|1|b
4|2|c
4|3|a
5|1|c
5|2|a
5|3|b
6|1|c
6|2|b
6|3|a
13 апр 12, 18:13    [12413820]     Ответить | Цитировать Сообщить модератору
 Re: получить все перестановки в ту же таблицу  [new]
Шпунтик
Member

Откуда:
Сообщений: 148
Шпунтик,

up^^
23 апр 12, 16:44    [12458192]     Ответить | Цитировать Сообщить модератору
 Re: получить все перестановки в ту же таблицу  [new]
user89
Member

Откуда:
Сообщений: 2083
Шпунтик,

declare @t table (a varchar(50));
insert into @t values ('a'),('b'),('c');

;with cte as (
  select a1,a2,a3, row_number() over (order by a1, a2, a3) [gr]
  from (
    select t1.a [a1], t2.a [a2], t3.a [a3], row_number() over (partition by t1.a, t2.a order by t1.a) [rn]
    from @t t1
    cross join @t t2
    cross join @t t3
  ) tmp
  where a1 <> a2 and a1 <> a3 and a2 <> a3
)
select gr, rn, tt
from cte
cross apply (select a1,'1' union all select a2,'2' union all select a3,'3') i (tt,rn)

Шпунтик
но в общем случае число переменных будет неизвестно ({1,2,3,....,n})
Надо через динамический SQL
23 апр 12, 18:41    [12458938]     Ответить | Цитировать Сообщить модератору
 Re: получить все перестановки в ту же таблицу  [new]
user89
Member

Откуда:
Сообщений: 2083
В этой строчке row_number лишний
select t1.a [a1], t2.a [a2], t3.a [a3], row_number() over (partition by t1.a, t2.a order by t1.a) [rn]

Можно просто
declare @t table (a varchar(50));
insert into @t values ('a'),('b'),('c');

;with cte as (
  select a1,a2,a3, row_number() over (order by a1, a2, a3) [gr]
  from (
    select t1.a [a1], t2.a [a2], t3.a [a3]
    from @t t1
    cross join @t t2
    cross join @t t3
  ) tmp
  where a1 <> a2 and a1 <> a3 and a2 <> a3
)
select gr, rn, tt
from cte
cross apply (select a1,'1' union all select a2,'2' union all select a3,'3') i (tt,rn)

+ Результат
grrntt
11a
12b
13c
21a
22c
23b
31b
32a
33c
41b
42c
43a
51c
52a
53b
61c
62b
63a
23 апр 12, 18:47    [12458956]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить