SQL从一条记录返回多行

时间:2009-11-07 21:42:52

标签: sql

这与减少重复记录相反。 用于创建物理库存清单的SQL查询 如果widget-xyz的qty为1项返回1行,但如果它有5,则返回5行等。 对于特定仓库中的所有小部件。

以前使用宏处理excel中的范围来处理,检查qty列。有没有办法进行单一查询呢?

这些表是由应用程序生成的FoxPro dbf文件,我将其输出到html

4 个答案:

答案 0 :(得分:2)

而不是像Nestor建议的那样生成一个xml字符串并使用xml解析函数生成一个计数器,你可以考虑加入递归CTE作为计数器,正如LukLed暗示的那样:

WITH Counter AS
(
    SELECT 0 i

    UNION ALL

    SELECT i + 1
    FROM Counter
    WHERE i < 100
),
Data AS
(
    SELECT 'A' sku, 1 qty
    UNION
    SELECT 'B', 2
    UNION
    SELECT 'C', 3
)
SELECT * 
FROM Data
    INNER JOIN Counter ON i < qty

根据查询分析器,此查询比xml伪表快得多。这种方法还为您提供了一个带有自然键(sku,i)的记录集。

MSSQL中的默认递归限制为100,会限制您的计数器。如果您有数量&gt; 100,您可以增加此限制,使用嵌套计数器,也可以创建物理表进行计数。

答案 1 :(得分:1)

您可以使用数字从1到最大(数量)的表格,并按quantity <= number加入您的表格。你可以通过多种方式实现它,但这取决于sql引擎。

答案 2 :(得分:1)

对于SQL 2005/2008,请查看

CROSS APPLY

我要做的是用一个子表来交叉应用每一行,其行数和数量一样多。第二个问题是如何创建该子表(我建议创建一个xml字符串,然后用xml运算符解析它) 我希望这会给你一个起点指针......

开始
declare @table table (sku int, qty int);
insert into @table values (1, 5), (2,4), (3,2);
select * from @table;

sku         qty
----------- -----------
1           5
2           4
3           2

您可以生成:

with MainT as (
    select *, convert(xml,'<table>'+REPLICATE('<r></r>',qty)+'</table>') as pseudo_table
    from @table 
)
select p.sku, p.qty
from MainT p 
CROSS APPLY 
(
    select p.sku from p.pseudo_table.nodes('/table/r') T(row)
) crossT


sku         qty
----------- -----------
1           5
1           5
1           5
1           5
1           5
2           4
2           4
2           4
2           4
3           2
3           2

这就是你想要的吗? 认真的老兄......下次再写下你的问题。不可能确切地知道你在寻找什么。

答案 3 :(得分:-1)

您可以使用动态sql执行此操作。