2009-11-07 149 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