在一个假设的例子中,假设我有两个表: FARM 和 FRUIT
FARM的组织方式如下:
FARM_ID Size
1 50
2 100
3 200
...
和FRUIT组织如下:
Reference_ID FRUIT
1 Banana
1 Grape
1 Orange
2 Banana
2 Strawberry
FRUIT表是从excel获取参数@fruit创建的,这是一个使用'/'的分隔字符串。
例如,@ fruit ='Banana / Grape / Orange'
并使用如下声明:
INSERT INTO FRUIT(
Fruit,
Reference_ID,
)
SELECT Fruit, Scope_IDENTITY() from split_string(@fruit, '/')
split_string是一个函数。
我的目标是检查更新。我想接收一个Farm_ID和@fruit,检查是否有任何变化。
1)如果值没有改变,不要做任何事情
2)如果添加了新水果,请使用farm_ID
将其添加到FRUIT表中3)如果FRUIT表中的水果与尊重的FARM_ID的新分隔列表不对应,请将其从FRUIT表中删除。
我认为合并声明可能会起作用,但愿意接受建议。如果有什么不清楚,请告诉我。谢谢
修改
我对SQL很新,但尝试过使用合并...
Declare @foo tinyint
Merge Fruit as Target
Using (Select Fruit , @workingID From split_string(@fruit, '/') As source (fruit, ID)
--@workingID is just a way to get the ID from other parts of the sproc.
ON (TARGET.fruit = source.fruit)
WHEN MATCHED THEN
SET @foo = 1
WHEN NOT MATCHED
THEN DELETE
WHEN NOT MATCHED THEN
INSERT INTO FRUIT(
Reference_ID,
Fruit
)
VALUES(
然后我对如何获得独特的新值
有点困惑答案 0 :(得分:0)
您的输入包含针对服务器场ID的新水果列表。因此,更好的选择是删除现有的并在农场中插入新的水果列表。
示例脚本如下所示。
--loading the input to temp table
SELECT Fruit,@referenceid ReferenceId -- farmid corresponding tithe fruit list
INTO #temp
FROM Split_string(@fruit,'/')
-- delete the existing data against the given farmid
DELETE FROM fruit f
WHERE EXISTS ( SELECT 1 FROM #temp t
WHERE f.Reference_id=t.ReferenceId)
-- insert the new list
INSERT INTO fruit
SELECT fruit,referenceId
FROM #temp