SQL Server-在查询结果中多次列出单行

SQL Server-在查询结果中多次列出单行,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,我在SQL Server数据库中有一个数据集,我想运行一个查询来列出一个表中的记录,根据该表列中相应的整数值多次 我看过很多关于在查询中多次列出记录的帖子,大多数更合适的回答都描述了涉及交叉连接的解决方案。然而,我所描述的情况与我所看到的略有不同 记录的表结构类似于以下内容: +-----+-------+------+------+ | id | name | type | num | +-----+-------+------+------+ | 1 | bob | red

我在SQL Server数据库中有一个数据集,我想运行一个查询来列出一个表中的记录,根据该表列中相应的整数值多次

我看过很多关于在查询中多次列出记录的帖子,大多数更合适的回答都描述了涉及交叉连接的解决方案。然而,我所描述的情况与我所看到的略有不同

记录的表结构类似于以下内容:

+-----+-------+------+------+
| id  | name  | type | num  |
+-----+-------+------+------+
| 1   | bob   | red  | 1    |
+-----+-------+------+------+
| 2   | sam   | blue | 3    |
+-----+-------+------+------+
| 3   | viv   | green| 2    |
+-----+-------+------+------+
我想在查询结果中显示如下

+-----+-------+------+
| id  | name  | type |
+-----+-------+------+
| 1   | bob   | red  |
+-----+-------+------+
| 2   | sam   | blue |
+-----+-------+------+
| 2   | sam   | blue |
+-----+-------+------+
| 2   | sam   | blue |
+-----+-------+------+
| 3   | viv   | green|
+-----+-------+------+
| 3   | viv   | green|
+-----+-------+------+
。。。其中,每条记录根据其在原始行中列出的编号多次出现。鲍勃*1,萨姆*3,维夫*2

这是否可以通过交叉连接或任何其他方法实现

注意:这不需要非常高效。

使用存储过程 创建一个临时表变量 在while循环中将insert写入临时表 而计数器 您可以尝试使用递归CTE


另一个选项是临时理货/数字表

范例

还是简单的连接


另一个选项是临时理货/数字表

范例

还是简单的连接

编辑: 谢谢,@MatBailie

在num列上使用递归CTE生成所需的重复次数,并执行左连接:

给出如下表so1:

   id   name   type    num
    1   bob    red      1
    2   sam    blue     3
    3   viv    green    2
    4   jon    grey     7 
尝试:

输出:

id  name  type
1   bob   red 
2   sam   blue      
2   sam   blue      
2   sam   blue      
3   viv   green     
3   viv   green     
4   jon   grey      
4   jon   grey      
4   jon   grey      
4   jon   grey     
4   jon   grey      
4   jon   grey      
4   jon   grey      
编辑: 谢谢,@MatBailie

在num列上使用递归CTE生成所需的重复次数,并执行左连接:

给出如下表so1:

   id   name   type    num
    1   bob    red      1
    2   sam    blue     3
    3   viv    green    2
    4   jon    grey     7 
尝试:

输出:

id  name  type
1   bob   red 
2   sam   blue      
2   sam   blue      
2   sam   blue      
3   viv   green     
3   viv   green     
4   jon   grey      
4   jon   grey      
4   jon   grey      
4   jon   grey     
4   jon   grey      
4   jon   grey      
4   jon   grey      

寻找递归C最简单的答案是创建一个数字表。然后将numbers.id上的numbers连接到1和data.num之间的数据。查找递归CTM最简单的答案是创建一个numbers表。然后连接到该数据。将numbers.id上的数字连接到1和data之间。numSP和循环是最终的回退位置,而不是第一个选项。SP和循环是最终的回退位置,而不是第一个选项。假设a。sol中的所有ID都是连续的,没有间隙b。最低id为1,最高id大于或等于最高num。这也不是交叉连接。这是一个左连接,是您自己在SQL中键入的。也许你的意思是一个自连接?出于知识的目的,如果递归CTE已经复制了记录,那么左连接的原因是什么?谢谢假设a。sol中的所有ID都是连续的,没有间隙b。最低id为1,最高id大于或等于最高num。这也不是交叉连接。这是一个左连接,是您自己在SQL中键入的。也许你的意思是一个自连接?出于知识的目的,如果递归CTE已经复制了记录,那么左连接的原因是什么?谢谢@MatBailie我怀疑连接速度更快,但交叉应用允许更大的灵活性。@MatBailie我怀疑连接速度更快,但交叉应用允许更大的灵活性。谢谢!这很简单,可以实现这个技巧,并且很容易根据我的实际情况进行修改。如果num=0,我希望记录显示一次,所以我在WITH子句的第一部分将0设置为startnum。再次感谢!谢谢这很简单,可以实现这个技巧,并且很容易根据我的实际情况进行修改。如果num=0,我希望记录显示一次,所以我在WITH子句的第一部分将0设置为startnum。再次感谢!
   id   name   type    num
    1   bob    red      1
    2   sam    blue     3
    3   viv    green    2
    4   jon    grey     7 
WITH RECURSIVE exp_num AS
(
SELECT id, num FROM so1
UNION
SELECT id, num - 1 FROM exp_num WHERE num > 1
)

SELECT s1.* FROM so1 s1
LEFT JOIN
(
SELECT id FROM exp_num
) s2
ON s1.id = s2.id
id  name  type
1   bob   red 
2   sam   blue      
2   sam   blue      
2   sam   blue      
3   viv   green     
3   viv   green     
4   jon   grey      
4   jon   grey      
4   jon   grey      
4   jon   grey     
4   jon   grey      
4   jon   grey      
4   jon   grey