将重复序列加入到结果中

时间:2011-12-13 21:50:55

标签: sql-server tsql

如果我的表格包含以下数据:

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

EDIT2: 第二个表的数据来自以下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 个答案:

答案 0 :(得分:4)

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

<强>更新

要从split函数中获取序列,可以在返回的表中添加一个标识字段。

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