使用子查询使用同一表中的值更新表

Posted

技术标签:

【中文标题】使用子查询使用同一表中的值更新表【英文标题】:Update table with value from the same table using a sub query 【发布时间】:2018-09-06 21:25:01 【问题描述】:

我使用 sqlite 并且有一个看起来像这样的表:

我正在尝试使用 col2 对应 col1 的值更新引用列

我试过像

这样的查询
update tab1 
set refer = (select col2 from tab1 where col1 = refer) 
where col1 = 2

这但不起作用。

我也试过了

update tab1 
set refer = (select tem1.col2 
             from tab1 tem1, tab1 tem2 
             where tem1.col1 = tem2.refer and tem2.col1=2) 
where col1 = 2

这行得通。

但我不确定这是否是正确的做法。

Expected

【问题讨论】:

UPDATE rows with values from the same table的可能重复 您实际使用的是哪些 dbms? (删除未涉及产品的标签。) 这里的大多数人想要格式化文本,而不是图像(或图像链接)。 请发布预期结果 哪个数据库正在使用?? 【参考方案1】:

查看您的代码似乎您需要

   update tab1 
   set refer = col2  
   when col1 = refer 
   and col1 = 2 

意思是

   update tab1 
   set refer = col2  
   when  refer  2 

如果您正在使用子查询在同一个表上寻找更新,您应该可以使用内部联接

mysql

 update tab1 
 INNER JOIN (
      select col1, col2 
      from tab1 
      where col1 = refer ) t t.col1 = tabl1.col1 and  col1 = 2

在 sqllite 中你可以使用

  update tab1 
  set refer = (select t.col2 from (
  select col2 from tab1 where col1 = refer
  ) t )
  where col1 = 2

【讨论】:

抱歉少了一个大括号。它有效,它与我使用的有什么不同,哪个更好? 有效,和我用过的有什么不同,哪个更好? 不同之处在于两个内部子选择强制数据库引擎创建一个临时表,因此更新不适用于同一个..表..哪个更好? ,,mine 更清楚 .. 您使用无用的笛卡尔积来获得相同的结果.. 但是对于大表,您会产生性能问题 相同的查询不适用于where col1=5,它正在更新为 Null,你能帮忙@scaisEdge 我认为它有时不起作用,它正在使用空值进行更新。 @scaisEdge【参考方案2】:

最后这个查询完美运行:

update tab1 
set refer = (select t1.col2 from tab1 as t1 where t1.col1 = tab1.refer) 
where tab1.col1 = 2

【讨论】:

以上是关于使用子查询使用同一表中的值更新表的主要内容,如果未能解决你的问题,请参考以下文章

连接两个表子查询

MySQL 子查询 派生表子查询错误

Laravel 多表子查询

使用同一列中的值更新表中的唯一列

MySQL------ 子查询

MySQL------ 子查询