2010-06-29 22 views
3

我有兩個表「TempStore」和「商店」與同一列稱爲「項目」。SQL多重插入一個表,而循環/迭代另一個表?

「TempStore」表中有數據需要移動到「Store」表中,這些數據只需要很少的修改。

我需要遍歷「TempStore」數據(即項目),並插入到店......

更具體地說:我如何可以遍歷TempStore(在SQL),其中「在‘TempStore’每個項目我需要在「存儲」中存儲2個或3個項目,而且幾乎不需要修改「,我該怎麼做到這一點?

我想要做的就是把每rowdata從 「[SELECT * FROM TempStore]」 並插入三個記錄在 「商店」 與能夠改變 「項目」

+1

你應該更具體地說明一行如何變成三行。理想情況下,包括樣本數據和預期結果。 – 2010-06-29 17:25:31

+0

可以說TempStore表具有{Items,Cost,Price,ActualCost,ActualPrice} 但是在Store表中我需要存儲{Items,Cost,Price}。從TempStore datarow ActualCost和ActualPrice需要被添加爲另一行存儲....(我希望這是有道理的)....不管怎麼說,是使用「WHILE-BEGIN-END」的解決方案? – VoodooChild 2010-06-29 17:32:43

回答

7

嘗試INSERT-SELECT:

INSERT INTO Store 
     (col1, col2, col3...) 
    SELECT 
     col1, col2, col3... 
     FROM TempStore 
     WHERE ... 

只是讓SELECT爲每個插入返回一行,並在您需要的Cols中生成值。您可能需要CASE以及到另一個表的連接來創建額外的行。根據意見

編輯,OP希望看到的數字表在行動

比方說TempStore表有{項目, 成本,價格,ActualCost,ActualPrice} 但在Store表我需要存儲 {物品,成本,價格}。該ActualCost 和ActualPrice從TempStore數據行 將需要添加爲存儲另一行 ....(我希望這是 意義上的)......反正,就是使用「而-BEGIN-END」的解決方案 ??

CREATE TABLE Numbers (Number int NOT NULL PRIMARY KEY) 
INSERT INTO Numbers VALUES(1) 
INSERT INTO Numbers VALUES(2) 
INSERT INTO Numbers VALUES(3) 


INSERT INTO Store 
     (Items, Cost, Price) 
    SELECT 
     t.Items, t.Cost 
      ,CASE 
       WHEN n.Number=1 THEN t.Price 
       WHEN n.Number=2 THEN t.ActualCost 
       ELSE t.ActualPrice 
      END 
     FROM TempStore   t 
      INNER JOIN Numbers N ON n.Number<=3 
     WHERE ... 

你甚至可以使用UNION:

INSERT INTO Store 
     (Items, Cost, Price) 
    SELECT 
     t.Items, t.Cost, t.Price 
     FROM TempStore t 
    UNION ALL 
    SELECT 
     t.Items, t.Cost, t.ActualCost 
     FROM TempStore t 
    UNION ALL 
    SELECT 
     t.Items, t.Cost, t.ActualPrice 
     FROM TempStore t 

無論是Numbers表格或聯盟將我們WAY比循環更好!

+0

@KM你確定是MS-SQL嗎?我不知道sybase是什麼,它使用什麼樣的sql? – 2010-06-29 17:09:53

+0

@KM:謝謝 - 這真是太好了,但是我怎樣才能在Store中爲TempStore中的每個rowdata插入3條記錄? – VoodooChild 2010-06-29 17:11:08

+0

@Srinivas Reddy Thatiparthy,sql server基於sybase,它們共享相同的原始t-sql語言。我曾經在某個時間或另一個時間工作過。請參閱http://en.wikipedia.org/wiki/T-SQL – 2010-06-29 17:12:02

1
INSERT INTO Store (SELECT * FROM TempStore UNION ALL SELECT * FROM TempStore) 

上述語句將在存儲器中爲TempStore中的每一行插入兩行。您可以將SELECT *更改爲您想要對該項目進行的任何修改。

+0

我想要做的是從「[SELECT * FROM TempStore]」中取出每個rowdata,並在「Store」中插入三條記錄,以便能夠更改「條目」。 – VoodooChild 2010-06-29 17:16:30

3

好的,我認爲KM提出了一個涉及「數字表」的優秀解決方案。然而,VoodooChild在評論中要求我在WHERE-BEGIN-END周圍使用INSERT-SELECT發佈我的建議的示例代碼。

我創建了兩個表,如VoodooChild的Store和TempStore。

商店有列StoreID,StoreName,StoreState,StoreNumber。

TempStore具有TempStoreID,TempStoreName列。

我預設了TempStoreName值爲First,Second,Third和Fourth。

現在,我的SQL將在滿足WHERE子句中的條件的TempStore表中的每個記錄的Store表中插入三條記錄到Store表。該條件是TempStoreName的長度,顯然不是真實世界的例子。

DECLARE @counter int 
SET @counter = 0; 
WHILE @counter < 3 
BEGIN 
INSERT INTO Store (StoreName, StoreState, StoreNumber) 
    SELECT TempStoreName, 'AZ', @counter FROM TempStore WHERE LEN(TempStoreName) = 5 
SET @counter = @counter + 1 
END 

這樣做的結果,當應用於空Store表是:

StoreID StoreName StoreState StoreNumber 
1   First  AZ   0 
2   First  AZ   1 
3   First  AZ   2 
4   Third  AZ   0 
5   Third  AZ   1 
6   Third  AZ   2 

因此,這種方法的工作原理。它似乎符合VoodooChild的需求。它可能是也可能不是最好的選擇,但是還有其他因素涉及我們不知道的決定,例如這個操作將會重複多少次。

+0

+1,感謝您執行我的請求。嗯,如果你感到無聊:你可以發佈另一個基於「數字表」的答案,如果沒有,那麼我仍然認爲你很棒。 – VoodooChild 2010-06-29 19:59:41

+0

哎呀我知道KM已經使用數字表更新了他的答案......我要看看它,看看哪一個更有意義。非常感謝你的幫助,你們很棒 – VoodooChild 2010-06-29 20:02:29

+0

@VoodooChild SO在這裏真的很適合你。您可以選擇兩種非常好的方法。我認爲知識管理的解決方案更加優雅,只要它適合你。 – DOK 2010-06-29 20:25:45

1

鑑於您的最新評論,這應該會給你你需要的。您應該有一些方法可以區分商店表中的值。也許一個「實際的」 BIT列或類似的東西:

INSERT INTO Stores (item, cost, price, actual) 
SELECT item, cost, price, 0 
FROM TempStores 
UNION ALL 
SELECT item, actual_cost, actual_price, 1 
FROM TempStores 

如果你需要調整列(例如,增加10%actual_price),那麼你可以這樣做:

INSERT INTO Stores (item, cost, price, actual) 
SELECT item, cost, price, 0 
FROM TempStores 
UNION ALL 
SELECT item, actual_cost, 1.1 * actual_price, 1 
FROM TempStores 
WHERE actual_cost IS NOT NULL 

我也在第二個SELECT語句中添加了WHERE子句以表明您可以過濾這些行。 WHERE子句只會影響第二個SELECT。所以,你也可以這樣做:

INSERT INTO Stores (item, cost, price, actual) 
SELECT item, cost, price, 0 
FROM TempStores 
WHERE cost IS NOT NULL 
UNION ALL 
SELECT item, actual_cost, 1.1 * actual_price, 1 
FROM TempStores 
WHERE actual_cost IS NOT NULL 
+0

+1嗯,這很有趣。我想我可以繼續做「聯盟所有」的次數我想迭代和選擇將工作,只要表是相同的。這種方法唯一的問題是,例如上面我會得到兩個插入 - 但我不能編輯數據插入...或者我不知道如何?請指教,謝謝! – VoodooChild 2010-06-29 19:56:09

+0

只要列數據類型匹配,select就會工作。他們可能來自不同的桌子。我不確定你的意思是「編輯」。你當然可以在上面的列上使用函數。我會添加一個簡單的例子。 – 2010-06-29 20:04:54

相關問題