【问题标题】:MSsql update column from joint table来自联合表的 MSsql 更新列
【发布时间】:2018-06-18 10:15:48
【问题描述】:

我有 2 张桌子。表1和表2

TABLE1                TABLE2
ID | SIZE | VALUE     ID  | SIZE | SCORE 
1  | LOW  | 1.0       1   | MID  | 3232
2  | MID  | 3.0       2   | MID  | 2321
3  | HIGH | 5.0       3   | HIGH | 3232

我想要的是更新 TABLE2.SCORE,所以值将是 TABLE1.value 列,连接是 SIZE。

   OUTPUT:
      ID  | SIZE | SCORE 
      1   | MID  | 3.0
      2   | MID  | 3.0
      3   | HIGH | 5.0

我试过了: Update Table2 set SCORE=(select top(1) VALUE from TABLE1 join TABLE2 on table1.size=table2.size ) 但是这不起作用我得到这个结果:

 OUTPUT:
  ID  | SIZE | SCORE 
  1   | MID  | 3.0
  2   | MID  | 3.0
  3   | HIGH | 3.0 <---- wrong 

【问题讨论】:

  • 你是什么意思“不起作用”?您是否收到错误、意外结果?
  • @larnu 所需的输出是错误的,我得到了相同的分数
  • table2.SCORE 列是整数,除非您将列更改为十进制 (2,1) 数据类型,否则您可以显示为十进制值

标签: sql sql-server


【解决方案1】:

试试这个

DECLARE @TABLE1  AS TABLE(ID INT , SIZE VARCHAR(10) , VALUE decimal(2,1))   
INSERT INTO @TABLE1
SELECT 1  , 'LOW'  , 1.0  UNION ALL    
SELECT 2  , 'MID'  , 3.0  UNION ALL    
SELECT 3  , 'HIGH' , 5.0      

DECLARE @TABLE2  AS TABLE(ID INT , SIZE VARCHAR(10) , SCORE INT)
INSERT INTO @TABLE2
SELECT 1   , 'MID'  , 3232 UNION ALL
SELECT 2   , 'MID'  , 2321 UNION ALL
SELECT 3   , 'HIGH' , 3232 


SELECT * FROM @TABLE2

UPDATE t2
SET SCORE=t1.VALUE
FROM @TABLE2 t2 inner join @TABLE1 t1 On t1.SIZE=t2.SIZE


SELECT ID,SIZE, CAST(SCORE AS DECIMAL(2,1)) AS SCORE

FROM @TABLE2

演示结果:http://rextester.com/VFF59681

【讨论】:

    【解决方案2】:

    您可以在UPDATE 中使用JOIN

    update t2
        set t2.score = t1.score
        from table2 t2 join
             table1 t1
             on t2.size = t1.size;
    

    您还可以通过使用相关子查询来遵循您的模式:

    update table2
        set t2.score = (select t1.score from table1 t1 where t1.size = table2.size);
    

    子查询中不需要另一个JOIN

    【讨论】:

      【解决方案3】:
      update a
      set a.score=b.score
      from table2 a join table1 b on a.id=b.id
      

      【讨论】:

        【解决方案4】:

        subquery中的JOIN不用写,直接表示为:

        update table2 
               set score = (select top (1) t1.score from table1 t1 where t1.size = table2.size);
        

        【讨论】:

          【解决方案5】:

          你可以这样实现:

          update table2
          set table2.SCORE = table1.VALUE
          from table2
          join table1
          on table2.SIZE = table1.SIZE
          

          但是,为避免出现问题,您需要确保 table1.SIZEunique

          【讨论】:

          • 正如您在 table2 中看到的那样,大小可以重复
          • @Susang 没关系。数据来源为表1。因此,在表 1 中,该值应该是唯一的。无论目的地有多少,都必须确保数据源具有确定性。
          • 抱歉,问题现在好像变了。在这种情况下你是对的,因为 OP 也想加入 size
          • @Susang 没问题。我从操作尝试操作的初始命令中知道:Update Table2 set SCORE=(select top(1) VALUE from TABLE1 join TABLE2 on table1.size=table2.size
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-22
          • 2017-01-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多