2016-11-11 123 views
-1

我在這裏列出了100種類型的項目風味。然後,我有一張桌子,我需要爲每種口味中的每件商品記錄一張。所以如果我有50個項目,我需要在這個table_A中的50個項目中的每一個100個記錄。所以最後在這個表中總共有100x50條記錄。SQL服務器 - 插入如果不存在其他更新

我現在擁有的是隨機組合的數據,我知道每個項目的每種風味都沒有記錄。

我需要幫助的是,一個想法/算法,所以解決這個問題。僞代碼會做。我有一個包含所有可能口味(tbl_flavor)的表格和一個包含所有50個項目(tbl_items)的表格。這兩個將決定需要在table_A中放置什麼,這基本上是一個庫存。

請指教。

+0

你能用目前爲止的代碼更新你的問題嗎?如果我們看到您迄今爲止所嘗試的內容以及您遇到困難的位置,則幫助會更容易。 – Brian

+0

使用CTE作爲(從A交叉聯接B中選擇A. *,B *)插入到FinalTable中從CTE中選擇* CTE.Key不存在(從FinalTable中選擇鍵)交叉聯接爲您提供了一組完整的50 * 100.不出口將排除你已經在桌上的所有人。或者更容易,只需從表中刪除所有內容並插入交叉連接中的所有內容(除非需要保留其他屬性) – xQbert

+0

使用合併子句。 –

回答

1

如果我正確理解你的問題,一個SQL Server EXCEPT查詢會有所幫助。

正如評論所指出的,這裏是如何獲得的物品和口味的矩陣:

SELECT Items.Item, Flavors.Flavor 
FROM Items 
CROSS JOIN Flavors 

下面是如何獲得的物品和口味的矩陣,忽略那些已經在你的其他組合表。

SELECT Items.Item, Flavors.Flavor 
    FROM Items 
    CROSS JOIN Flavors 
EXCEPT SELECT Item, Flavor 
    FROM Table_A 

所以INSERT變爲:

INSERT INTO Table_A (Item, Flavor) 
SELECT Items.Item, Flavors.Flavor 
    FROM Items 
    CROSS JOIN Flavors 
EXCEPT SELECT Item, Flavor 
    FROM Table_A 

這個查詢是未經測試,因爲我不是100%肯定的問題。如果你發佈更多的細節,我會測試它。

+0

謝謝。這正是我想要的。 – Eclipse

+0

我的查詢有一個問題。當我嘗試以下時,它會失敗並顯示錯誤消息:使用UNION,INTERSECT或EXCEPT運算符組合的所有查詢必須具有相同數量的表達式....... insert into table_A(flavor_id,prod_id,available_qty,lastupdated, lastupdatedby) \t select fla.flavor_id,sp。PRODUCT_ID,200,GETDATE(), '用戶1' \t從香精FLA \t \t交叉聯接產品SP \t其中在(選擇list_products product_cd)sp.product_cd \t和fla.flavor_id在(從tblX選擇fla_value其中fla_value ='Y') \t除了在我的插入中選擇pl.flavor_id,pl.product_id from table_A pl – Eclipse

+0

,我必須至少提供一個lastupdated。現在的問題是,如果我添加額外的字段在我的選擇和除了,它會得到我錯誤的結果集。有什麼建議麼? – Eclipse

1

有幾種方法可以解決這類問題。這是其中一種方式的psuedocode。

Update table 
set Col1 = SomeValue 
where MyKeys = Mykeys 

if (@@ROWCOUNT = 0) 
begin 
    Insert table 
    (Cols) 
    Values 
    (Vals) 
end 

或者您可以使用MERGE。 https://msdn.microsoft.com/en-us/library/bb510625.aspx

+0

但是,如果出現錯誤,合併很難在以後進行故障排除。我更喜歡更新插入方法。在插入之前進行更新非常重要,以避免插入和更新新記錄。 – HLGEM

+0

同意。儘管是「舊式」方法,但我發現處理起來要容易得多。 –

0

嘗試這個

UPDATE MyTable 
     SET 
     ColumnToUpdate = NewValue 
     WHERE EXISTS 
     (
      SELECT 
       1 
       FROM TableWithNewValue 
        WHERE ColumnFromTable1 = MyTable.ColumnName 
     ) 

INSERT INTO MyTable 
(
    Column1, 
    Column2, 
    ... 
    ColumnN 
) 
SELECT 
    Value1, 
    Value2, 
    ... 
    ValueN 
    FROM TableWithNewValue 
     WHERE NOT EXISTS 
     (
      SELECT 
       1 
       FROM MyTable 
        WHERE ColumnName = TableWithNewValue.ColumnFromTable1 
     ) 
相關問題