Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql t-sql根据字段值返回多行_Tsql - Fatal编程技术网

Tsql t-sql根据字段值返回多行

Tsql t-sql根据字段值返回多行,tsql,Tsql,我正在尝试在只允许t-sql的系统上运行导出。我对php的了解足以生成foreach循环,但对t-sql的了解不足以为给定数量生成多行。 我需要一个结果来制作一个包含4个类似数据中的1个的项目列表 给我一张像这样的桌子 orderid, product, quantity 1000,ball,3 1001,bike,4 1002,hat,2 如何获得选择查询结果,如: orderid、item_num、total_items、, 产品 1000,1,3,球 1000,2,3,球 1000,3,

我正在尝试在只允许t-sql的系统上运行导出。我对php的了解足以生成foreach循环,但对t-sql的了解不足以为给定数量生成多行。 我需要一个结果来制作一个包含4个类似数据中的1个的项目列表

给我一张像这样的桌子

orderid, product, quantity
1000,ball,3
1001,bike,4
1002,hat,2
如何获得选择查询结果,如:

orderid、item_num、total_items、, 产品

1000,1,3,球

1000,2,3,球

1000,3,3,球

1001,1,4,自行车

1001,2,4,自行车

1001,3,4,自行车

1001,4,4,自行车

1002,1,2,帽子

1002,2,2,帽子


您可以借助辅助数字表来完成此操作

;WITH T(orderid, product, quantity) AS
(
select 1000,'ball',3 union all
select 1001,'bike',4 union all
select 1002,'hat',2
)

SELECT orderid, number as item_num, quantity as total_items, product
FROM T
JOIN master..spt_values on number> 0 and number <= quantity
where type='P'

注意:上面的代码使用master..spt_values表-这只是为了演示目的,我建议您使用创建自己的计数表。

好吧,如果您知道任何产品的最大值,并且它不是太大,例如4,您可以:

创建一个名为Nums的辅助表,其中包含1个整数列n,行包含1,2,3,4


如果您使用的是SQLServer2005或更高版本,则可以尝试使用递归CTE而不是计数表

;WITH CTE AS
(
    SELECT orderid, 1 item_num, product, quantity
    FROM YourTable
    UNION ALL
    SELECT orderid, item_num+1, product, quantity
    FROM CTE
    WHERE item_num < quantity
)
SELECT *
FROM CTE
OPTION (MAXRECURSION 0)

我不是在一台有数据库引擎的计算机上,在那里我可以测试这个,所以让我知道它是如何运行的。

交叉连接语法会更好,不是一个大问题。用交叉联接运算符替换表列表中的运算符。两者都产生笛卡尔积。@Thomas有区别吗?@Thomas-Yep。每个辅助数字表都有一些限制@noob-这只是为了演示,我建议您使用这里的一种技术+1创建自己的理货表,但为什么数字不在1和数量之间呢?我的意思是,我想知道这是否有什么不同。@Andrey-我已经考虑过做那个编辑了。我同意这更整洁,但希望OP将使用1..n的永久理货表,这样他们可以在实际查询中完全删除数字>0的检查。谢谢大家。我刚刚学了一点SQL,这个解决方案正好解决了我的问题。
;WITH CTE AS
(
    SELECT orderid, 1 item_num, product, quantity
    FROM YourTable
    UNION ALL
    SELECT orderid, item_num+1, product, quantity
    FROM CTE
    WHERE item_num < quantity
)
SELECT *
FROM CTE
OPTION (MAXRECURSION 0)