SQL比较相同的表复制某些列的值

时间:2018-01-11 13:29:05

标签: sql sql-server tsql join insert

我有两个相同的表(x)和(y)(我从表x到表y进行了备份)我删除了表x中的所有内容以重新生成新行(我添加了restmilk_3作为额外参数)。

现在我的ID在表x中是新的(它移动了因为我添加了restmilk_3),所以我想将表y中的值复制到x名称和RID(配方ID)

看起来如何:

**table y**

ID - RID            - Name        - Value
1  - Cheese_rec_100 - restmilk_1  - cheese1
2  - Cheese_rec_100 - restmilk_2  - cheese3
3  - Cheese_rec_100 - milkamount  - 5000
..
100- Cheese_rec_100 - milkdensity - 0.46


**table x** (We added restmilk 3 as a new parameter):

ID - RID            - Name        - Value
1  - Cheese_rec_100 - restmilk_1  - NULL
2  - Cheese_rec_100 - restmilk_2  - NULL
3  - Cheese_rec_100 - restmilk 3  - NULL
4  - Cheese_rec_100 - milkamount  - NULL
..
100- Cheese_rec_100 - milkdensity - NULL


After the query:

ID - RID            - Name        - Value
1  - Cheese_rec_100 - restmilk_1  - cheese1
2  - Cheese_rec_100 - restmilk_2  - cheese3
3  - Cheese_rec_100 - restmilk 3  - NULL
4  - Cheese_rec_100 - milkamount  - 5000
..
100- Cheese_rec_100 - milkdensity - 0.46

所以我不能使用ID作为密钥来复制Value,但我需要检查两个表中的RID和Name是否相等。

我尝试了很多东西,但我没有技能/经验来解决这个难题。

我使用的是Microsoft SQL Server Management Studio 数据库排序规则:Latin1_General_CI_AS 兼容级别:SQL Server 2012

我拥有管理员的所有权利。

示例现有表格:

ID  RID Version NodeID  Name    TagAddress  Value
854389  Cheese_Rec_00100    61  8   _RestMilk14 -   0
854390  Cheese_Rec_00100    61  8   _RestMilk15 -   0
854391  Cheese_Rec_00100    61  8   _RestMilk16 -   0
854392  Cheese_Rec_00100    61  8   _RestMilk17 -   0
854393  Cheese_Rec_00100    61  8   _RestMilk18 -   0
854394  Cheese_Rec_00100    61  8   _Starter1388Delay   -   240
854395  Cheese_Rec_00100    61  8   _Starter1388Target  -   90
854396  Cheese_Rec_00100    61  8   _Starter1389Delay   -   0
854397  Cheese_Rec_00100    61  8   _Starter1389Target  -   0
854398  Cheese_Rec_00100    61  8   _TransPercentageFat -   0,94
854399  Cheese_Rec_00100    61  8   _TransPercentProtein    -   0,935
854400  Cheese_Rec_00100    61  8   _VATPostWaterTempSP -   33,1
854401  Cheese_Rec_00100    61  8   _VATRecipeNo    -   19
854402  Cheese_Rec_00100    61  8   _WheyCreamLimit -   2
854403  Cheese_Rec_00100    61  8   _AmountOfMilk   -   1000
854404  Cheese_Rec_00100    61  8   _AverageWeightAt15D -   13,3
854405  Cheese_Rec_00100    61  8   _CaCl2Delay -   600
854406  Cheese_Rec_00100    61  8   _CaCl2Target    -   0,1337

2 个答案:

答案 0 :(得分:0)

您可以使用UNION检查/确保表X和Y中的RID和NAME列是否相等..

SELECT RID,Name FROM y   联盟   SELECT RID,名称来自X

如果返回的行数等于表X中的行数,则按照您在评论中提到的更新。

UPDATE X SET X.VALUE = Y.VALUE   来自X.   INNER JOIN Y ON Y.RID = X.RID AND Y.NAME = X.NAME

希望这有帮助。

答案 1 :(得分:0)

最后这是我的代码:

update [TPMDB].[dbo].[RecipeNodeParameter]

set 
    [TPMDB].[dbo].[RecipeNodeParameter].Value = [TPMDB].[dbo].[RecipeNodeParameter_2].Value,

    [TPMDB].[dbo].[RecipeNodeParameter].MaterialTagAddress = [TPMDB].[dbo].[RecipeNodeParameter_2].MaterialTagAddress,

    [TPMDB].[dbo].[RecipeNodeParameter].[Material_PLCID] = [TPMDB].[dbo].[RecipeNodeParameter_2].[Material_PLCID] ,

    [TPMDB].[dbo].[RecipeNodeParameter].[Material_SiteMaterialAlias] = [TPMDB].[dbo].[RecipeNodeParameter_2].[Material_SiteMaterialAlias],

    [TPMDB].[dbo].[RecipeNodeParameter].[Material_Name] = [TPMDB].[dbo].[RecipeNodeParameter_2].[Material_Name]  


From [TPMDB].[dbo].[RecipeNodeParameter] 


    INNER Join [TPMDB].[dbo].[RecipeNodeParameter_2] ON
    [TPMDB].[dbo].[RecipeNodeParameter_2].RID = [TPMDB].[dbo].[RecipeNodeParameter].RID

AND

    [TPMDB].[dbo].[RecipeNodeParameter_2].Name = [TPMDB].[dbo].[RecipeNodeParameter].Name

WHERE[TPMDB].[dbo].[RecipeNodeParameter].RID like '%cheese_rec_00100%'