【问题标题】:SQL compare to identical tables copy value from certain columnsSQL比较相同的表从某些列复制值
【发布时间】:2018-01-11 13:29:04
【问题描述】:

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

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

那么它的样子:

**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 作为键来复制值,但我需要检查两个表中的 RID 和名称是否相等。

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

我使用 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

【问题讨论】:

  • 这里似乎是旧的 XY 问题。为什么要更改表 X 中的 ID?如果您复制了所有数据,表 Y 中的所有“值”如何最终变为空?没有加起来的东西。除非您将表 ID 用于配方订单?这不是 ID 的用途。如果有必要,您应该有一个单独的列用于订购。
  • 我需要“重新生成”行以添加新参数 restmilk_3,因此我删除了表 x 中的所有内容并使用现有程序重新生成了参数列表。这就是我将表 x 复制到 y 的原因,这样我就可以放回信息,而操作员只需填写新参数 restmilk_3。
  • 为什么程序没有将新指令添加为 ID 101?为什么要用新 ID 替换 ID 3?这不是好的做法。是否有任何其他表通过外键链接到该表?如果是这样,那些钥匙现在不是坏了吗?
  • 嗨,Jacob,那是因为程序是一次性生成一个表格,而不是像现在这样不理会它:) 但是几年后我们需要一个额外的参数。该参数表用于复制到带有 OPC 服务器的 PLC。我很擅长重建这部分的技能,所以这就是我这样做的原因。我的问题没有解决方案吗?如果没有,我必须找到其他方式
  • 有可能,只是试图避免您的数据被损坏...名称字段中的所有值对于每个 RID 是否都是唯一的?

标签: sql sql-server tsql join insert


【解决方案1】:

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

选择 RID,名称来自 y 联盟 从 X 中选择 RID、名称

如果返回的行数等于表 X 中的行数。然后按照您在 cmets 中提到的更新。

更新 X 集 X.VALUE=Y.VALUE 从 X Y.RID=X.RID 和 Y.NAME=X.NAME 的内连接 Y

希望这会有所帮助。

【讨论】:

  • 谢谢!我明天试试,我会发布我的结果。
【解决方案2】:

最后这是我的代码:

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%'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多