2009-11-07 150 views
-1

这与减少重复记录相反。 用于创建物理清单核对清单的SQL查询 如果widget-xyz有1个项目的数量返回1行,但是如果它有5个,返回5个行等。 对于特定仓库中的所有小部件。SQL从一条记录返回多行

此前,这是通过在excel中检查数量列的宏来处理的。有没有办法让一个单一的查询呢?

表是由应用程序生成的FoxPro DBF文件,我输出到HTML

+0

此问题的答案高度依赖于您正在使用的数据库平台。 SQL Server?甲骨文?访问? – 2009-11-07 21:46:55

回答

1

对于SQL 2005/2008,看看

CROSS APPLY 

我会做的是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 

这是你想要的吗? 认真花花公子......下一次花更多精力写下你的问题。不可能确切地知道你在找什么。

+0

使用这个想法来创建一个行数量为qty的表,我尝试了这样的事情,然后做一个类似这样的查询: SELECT widgets.SKU FROM widgets INNER JOIN RowAmts ON widgets.QTY = RowAmts.qty; 然而,创建一个100行或99行99行的巨型表的前景看起来是错误的。或者是? – datatoo 2009-11-07 22:55:58

+0

对不起,你确实帮了我 – datatoo 2009-11-08 00:51:16

-1

为此,您可以使用动态SQL这一点。

+0

access和mssql,但这些表格是vfp – datatoo 2009-11-07 23:03:58

+0

这只会增加问题的复杂程度。 – Rodrigo 2010-08-06 21:18:22

1

您可以使用数字从1到最大(数量)的表格,并通过quantity <= number加入您的表格。你可以用很多方式来完成,但它依赖于sql引擎。

+0

有没有一个这样的连接的简单例子,我可以参考? – datatoo 2009-11-07 21:55:19

+0

你用什么sql引擎? – LukLed 2009-11-07 22:20:20

+0

FoxPro表和通常构建的东西在MSSQL或访问第一,然后我重现什么在网页中工作 – datatoo 2009-11-07 23:03:04

2

代替生成一个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,它会限制你的计数器。如果您的数量> 100,则可以增加此限制,使用嵌套计数器或创建一个物理表格进行计数。

+0

谢谢这非常值得一看 – datatoo 2010-02-11 20:59:02