【问题标题】:sql updating table b after selecting ids from table A从表 A 中选择 id 后 sql 更新表 b
【发布时间】:2017-08-08 09:58:57
【问题描述】:

我有两张桌子

表 A

   Pid  Name
    1        A
    3        B
    4        C

表 B

  Pid  Name  Status
   1        A      0
   2        B      0
   3        C      0
   4        D      0

我想通过选择所有表 A pid 将表 B 的状态从 0 更新为 1。

例如。表 A 没有 PId = 2,因此表 B 的 Pid = 2 不应更新。

我尝试了以下查询,但没有成功

UPDATE Table_B 
SET 
Status = 1
WHERE Table_B.Pid = (SELECT  Table_A.Pid 
                             FROM   Table_A 
                             WHERE  Table_A.Pid = Table_B.Pid) 

任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: sql sql-server database sql-server-2008 select


    【解决方案1】:

    即使在更新期间您也可以使用内部联接

      Update B
      SET Status = 1
      From Table_B as B
      INNER JOIN Table_A as A
      ON A.Pid = B.Pid
      WHERE B.Status = 0
    

    【讨论】:

      【解决方案2】:

      试试这个

      UPDATE B 
      SET 
      Status = 1
      from Table_B B
      inner join Table_A A on A.pid = B.pid
      WHERE  B.Status = 0
      

      【讨论】:

        【解决方案3】:

        试试:

        UPDATE Table_B 
        SET 
        Status = 1
        WHERE Table_B.Pid in (SELECT Table_A.Pid FROM Table_A )
        

        【讨论】:

          【解决方案4】:

          也许这是一个简化的例子,但我发现这有 2 个问题。首先,Name 列不应该存在于 2 个不同的地方——只有 1 个。其次,Status 应该在需要时计算,而不是更新。

          所以应该更像:

          SELECT b.Pid,
          b.Name,
          CASE WHEN a.Pid IS NULL THEN 0 ELSE 1 END AS Status
          FROM Table_B
          LEFT JOIN (SELECT a.Pid
                FROM Table_A
                GROUP BY a.Pid) AS a
          ON b.Pid = a.Pid
          

          【讨论】:

            猜你喜欢
            • 2011-09-28
            • 2022-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-25
            • 2013-03-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多