Присоединить повторяющуюся последовательность к результатам - PullRequest
2 голосов
/ 14 декабря 2011

Если у меня есть таблица с такими данными, как:

Test1
Test2
Test3
Test4
Test5

И еще одна таблица с такими данными, как:

Foo1
Foo2
Foo3

Как я могу объединить последнюю с первой, например:

Test1  Foo1
Test2  Foo2
Test3  Foo3
Test4  Foo1
Test5  Foo2

По существу, повторяя ту же последовательность из второй таблицы для всей первой таблицы.

РЕДАКТИРОВАТЬ: Мне также нужны данные во второй таблице, чтобы остаться вэтот порядок (он исходит из табличной переменной), даже если они не имеют естественного порядка в алфавитном порядке.

Итак, если вторая таблица выглядит следующим образом:

Foo2
Foo3
Foo1

Результат должен выглядеть следующим образом:

Test1  Foo2
Test2  Foo3
Test3  Foo1
Test4  Foo2
Test5  Foo3

РЕДАКТИРОВАТЬ2: Данные для второй таблицы поступают из следующих TVF.Я разделяю строку, которая выглядит как "Foo1, Foo2, Foo3".Как бы я добавить последовательность к результату этого разделения?

CREATE FUNCTION [dbo].[Split]
( 
    @Data varchar(max),
    @Delimiter varchar(max)
) 
RETURNS @Tokens table
(
    Token varchar(max)
)
AS
BEGIN

while (charindex(@Delimiter, @Data) > 0)
begin
    insert into @Tokens (Token)
    select
        ltrim(rtrim(substring(@Data,1,charindex(@Delimiter,@Data)-1)))
    select
        @Data = substring(
                 @Data,charindex(@Delimiter,@Data)+len(@Delimiter),len(@Data))
end

insert into @Tokens (Token)
select
    ltrim(rtrim(@Data))

return

1 Ответ

4 голосов
/ 14 декабря 2011
declare @T1 table(Col varchar(10))
declare @T2 table(Col varchar(10))

insert into @T1 values
('food1'),('food2'),('food3'),('food4'),('food5')

insert into @T2 values
('eat1'),('eat2'),('eat3')

;with C1 as
(
  select col,
         row_number() over(order by col) - 1 as rn
  from @T1
),
C2 as
(
  select col,
         row_number() over(order by col) - 1 as rn
  from @T2
)
select C1.col,
       C2.Col
from C1
  inner join C2
    on (C1.rn % (select count(*) from C2)) = C2.rn
order by C1.Col

Обновление

Чтобы получить последовательность из функции разделения, вы можете добавить поле идентификации в возвращенную таблицу.

CREATE FUNCTION [dbo].[Split]
( 
    @Data varchar(max),
    @Delimiter varchar(max)
) 
RETURNS @Tokens table
(
    Token varchar(max),
    ID int identity
)
AS
BEGIN
 ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...