【问题标题】:Update with a Select使用 Select 更新
【发布时间】:2011-06-08 02:24:25
【问题描述】:

如何使用表 Y 更新表 X 中的 StatusID?

表 X 具有 SourceID 和旧 StatusID
表 Y 有 SourceID 和新的 StatusID

update x
set StatusID= (select StatusID from Y)
where
SourceID = (select SourceID from Y)

这是对的吗?我害怕运行查询,以防万一它搞砸了一切......

我正在使用连接来获取表 Y 的 StatusID,所以我认为我需要使用 SELECT

这就是我获取表 Y 的 SourceID 和 StatusID 的方式

select  t2.Sourceid,  t3.ActionID
from tblSource t2 
right join  Y t1 on t1.BaselineSourceKey= t2.tempSourceID
 right join lkuActionCode t3
       on t3.actioncode = CASE 
       WHEN t1.actionCode  = 'R' THEN 'N' 
       WHEN t1.actionCode  = 'B' THEN 'R' 
       WHEN t1.actionCode  = 'A' THEN 'R' 
       WHEN t1.actionCode  = 'E' THEN 'N' 
       WHEN t1.actionCode  = 'F' THEN 'S' 
       WHEN t1.actionCode  = 'G' THEN 'S' 
       WHEN t1.actionCode  = 'K' THEN 'DP' 
       WHEN t1.actionCode  = 'Q' THEN 'C' 
       WHEN t1.actionCode  = 'S' THEN 'AER' 
       WHEN t1.actionCode  = 'T' THEN 'AEN' 
       WHEN t1.actionCode  = 'U' THEN 'C' 
       WHEN t1.actionCode  = 'V' THEN 'UR'
    WHEN t1.actionCode  = 'W' THEN 'R'             
        END
    where actionid <> 10 and actionid <> 8 and actionid <> 3

【问题讨论】:

  • 你到底想做什么?填充新列或保持数据一致?
  • 如果这个select StatusID from Y查询多行数据,你会怎么做?
  • 您发布的是最受支持的基于另一个值更新表的方法。 MySQL 和 SQL Server 是我所知道的唯一支持 UPDATE 语法中的 JOIN 的数据库。
  • 我更新了问题,请看
  • 有什么原因你不能备份数据库,运行它,如果一切都不好,然后恢复备份?

标签: mysql sql select sql-update


【解决方案1】:

这可能更简单

update x
set StatusID= Y.StatusID
from Y
where y.SourceID = X.SourceID

如果是Access,那么你可以使用

update x inner join y on y.sourceid=x.sourceid
set x.statusid = y.statusid

【讨论】:

  • 不,它是 sql,但是我在哪里使用我的选择从表 Y 中获取正确的数据?
  • 我最终用上面的查询创建了一个临时表,并根据您的建议更新了我的表,谢谢
【解决方案2】:

我不确定这是否有效。试试:

update x set StatusID=Y.StatusID
from Y where (x.SourceID=Y.SourceID);

ETA:这应该适用于 PostgreSQL,但我不确定其他 SQL 方言。

【讨论】:

    【解决方案3】:
    update x
    set StatusID = y.StatusID
    from x
    join y on x.SourceID= y.SourceID
    

    【讨论】:

      【解决方案4】:
      update x, y 
        set x.StatusID=y.StatusID 
        where x.SourceID=y.SourceID
      

      【讨论】:

      • 我正在使用连接来获取表 X 的 StatusID,所以我认为我需要使用选择。
      【解决方案5】:

      更新
      在 SQL Server 中,您可以这样做:

      UPDATE A
      SET A.StatusID= B.StatusId
      FROM TableX AS A
      JOIN TableY AS B
      ON A.SourceID = B.SourceID
      

      在你更新的问题中,现在你只是在做一个SELECT,它根本不会更新任何记录。你用的是什么数据库引擎?

      【讨论】:

      • SQL 2005。我显示的 Select 获取 SourceID 和新的 ActionID,然后我需要用它来更新表 X。但我不知道该怎么做....
      • @xrum 所有RIGHT JOINS 都有原因吗,因为最终你可以在SELECT 的输出上设置sourceid NULL
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      相关资源
      最近更新 更多