sql-server - 将重复序列连接到结果

标签 sql-server t-sql

如果我有一个包含以下数据的表:

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

最佳答案

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
 ....

关于sql-server - 将重复序列连接到结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8496688/

相关文章:

sql - 获取多个通话的日期

sql-server - 将分组的多个串联列返回到逗号分隔的字符串列

sql - SQL CASE 的 THEN 语句中的多个值

sql - 如何在游标内的动态查询中为参数赋值

mysql - 如何将多个下拉列表添加到用户指定的sql数据库中

sql-server - Identity 值硬编码的 SQL 最佳实践

C# 和 Mysql 不工作

c# - sql异常很慢……怎么提速?

sql - 为什么系统存储过程在包含所有者的情况下会失败?

sql - 参数化 SQL 和 NULL 运行缓慢