2011-12-13 54 views
2

如果我有了像數據的表:加入重複序列結果

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 
+0

如何訂購第二張表中的數據?您需要爲此添加至少另一列。 Theres在餐桌上沒有**自然順序** – Lamak

+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 

更新

要從分裂功能得到一個序列,您可以在返回的表中增加一個標識字段。

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

+1,尼斯回答 – Lamak

+0

這似乎是做我想要的。我只是有一個問題,所以我可以更好地理解這個解決方案。 C1 cte上-1的用途是什麼? –

+0

@JeremyCantrell - 'row_number()'從1開始計數,所以我需要得到模數'%'是正確的。在C1上沒有-1,你會在'food1'上有'eat2'作爲匹配。如果你問我,純屬錯誤:)。 –