使用merge

时间:2016-09-16 16:23:39

标签: sql sql-server

在一个假设的例子中,假设我有两个表: 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(

然后我对如何获得独特的新值

有点困惑

1 个答案:

答案 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