SQL服务器 - 插入如果不存在其他更新

问题描述:

我在这里列出了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

使用合并子句。 –

如果我正确理解你的问题,一个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

有几种方法可以解决这类问题。这是其中一种方式的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

同意。尽管是“旧式”方法,但我发现处理起来要容易得多。 –

尝试这个

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 
     )