SQL服务器 - 插入如果不存在其他更新
我在这里列出了100种类型的项目风味。然后,我有一张桌子,我需要为每种口味中的每件商品记录一张。所以如果我有50个项目,我需要在这个table_A中的50个项目中的每一个100个记录。所以最后在这个表中总共有100x50条记录。SQL服务器 - 插入如果不存在其他更新
我现在拥有的是随机组合的数据,我知道每个项目的每种风味都没有记录。
我需要帮助的是,一个想法/算法,所以解决这个问题。伪代码会做。我有一个包含所有可能口味(tbl_flavor)的表格和一个包含所有50个项目(tbl_items)的表格。这两个将决定需要在table_A中放置什么,这基本上是一个库存。
请指教。
如果我正确理解你的问题,一个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%肯定的问题。如果你发布更多的细节,我会测试它。
谢谢。这正是我想要的。 – Eclipse
我的查询有一个问题。当我尝试以下时,它会失败并显示错误消息:使用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
,我必须至少提供一个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
但是,如果出现错误,合并很难在以后进行故障排除。我更喜欢更新插入方法。在插入之前进行更新非常重要,以避免插入和更新新记录。 – HLGEM
同意。尽管是“旧式”方法,但我发现处理起来要容易得多。 –
尝试这个
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
)
你能用目前为止的代码更新你的问题吗?如果我们看到您迄今为止所尝试的内容以及您遇到困难的位置,则帮助会更容易。 – Brian
使用CTE作为(从A交叉联接B中选择A. *,B *)插入到FinalTable中从CTE中选择* CTE.Key不存在(从FinalTable中选择键)交叉联接为您提供了一组完整的50 * 100.不出口将排除你已经在桌上的所有人。或者更容易,只需从表中删除所有内容并插入交叉连接中的所有内容(除非需要保留其他属性) – xQbert
使用合并子句。 –