当前位置: 首页 > 知识库问答 >
问题:

表被指定两次,既作为“更新”的目标,也作为mysql中数据的单独源

纪正德
2023-03-14

我有下面的查询在mysql中,我想检查如果分支id和年的财务类型从branch_master是等于分支id和年的经理然后更新状态在经理表对分支id在经理

UPDATE manager as m1 
  SET m1.status = 'Y'
  WHERE m1.branch_id IN (
    SELECT m2.branch_id FROM manager as m2 
     WHERE (m2.branch_id,m2.year) IN (
        (
          SELECT DISTINCT branch_id,year 
            FROM `branch_master` 
           WHERE type = 'finance'
        )
     )
  )

但是犯了错误

表“m1”被指定了两次,既作为“更新”的目标,也作为单独的数据源

共有3个答案

彭弘方
2023-03-14

尝试使用EXISTS操作符:

UPDATE manager as m1 
SET m1.status = 'Y'
WHERE EXISTS (SELECT 1
              FROM (SELECT m2.branch_id             
                    FROM branch_master AS bm
                    JOIN manager AS m2
                    WHERE bm.type = 'finance' AND
                        bm.branch_id = m2.branch_id AND
                        bm.year = m2.year) AS t
              WHERE t.branch_id = m1.branch_id); 

注意:查询使用@Thorsten建议的附加嵌套级别,作为绕过表指定错误的一种方法。

这里是演示

薛兴德
2023-03-14

正确答案在这篇SO文章中。

这里接受的答案的问题是——正如已经多次提到的那样——创建整个表的完整副本。这远远不是最优的,也是最复杂的。其想法是将仅用于更新的数据子集具体化,因此在您的情况下,它将如下所示:

UPDATE manager as m1
SET m1.status = 'Y'
WHERE m1.branch_id IN (
    SELECT * FROM(
        SELECT m2.branch_id FROM manager as m2 
        WHERE (m2.branch_id,m2.year) IN (
            SELECT DISTINCT branch_id,year 
            FROM `branch_master` 
            WHERE type = 'finance')
    ) t
)

基本上,您只需将以前的数据查询源封装在

SELECT * FROM (...) t
林俭
2023-03-14

这是一个典型的MySQL事情,通常可以通过从派生的表中选择来规避,即而不是

FROM manager AS m2

使用

FROM (select * from manager) AS m2

完整声明:

UPDATE manager
SET status = 'Y'
WHERE branch_id IN
(
  select branch_id
  FROM (select * from manager) AS m2
  WHERE (branch_id, year) IN
  (
    SELECT branch_id, year
    FROM branch_master
    WHERE type = 'finance'
  )
);
 类似资料:
  • 问题内容: 我有以下MySQL查询,我要检查,如果 分支ID 和 年度 的 财务 从类型 branch_master 与平等的 分支ID 和 年 的 经理 ,然后更新状态在 管理 表中对 分公司的ID 在 经理 但出现错误 表’m1’被指定两次,既作为’UPDATE’的目标,又作为数据的单独源 问题答案: 这是典型的MySQL问题,通常可以通过从派生表中进行选择来规避,例如 采用 完整的声明:

  • 问题内容: 我有两个表需要相同的值以实现非规范化。 这是查询。 第一张桌子 第二张桌子 如您所见,两个表之间的唯一区别是它们的名称和两个表没有该字段 无论如何将两个更新合并为一个? 问题答案: 如文档中所述,应该可以进行多表更新。 http://dev.mysql.com/doc/refman/5.5/en/update.html 注意:多表不支持LIMIT,因此根据具体情况,这可能会引起更多麻烦

  • 问题内容: 我正在努力寻找解决此MySQL问题的方法。我似乎无法理解该怎么做。我有下表。 如果可能的话,我想将问题答案显示为每个结果集的列,如下所示。 任何帮助将非常感激。 谢谢 问题答案: SQLFiddle演示 如果您不清楚问题的数量( 例如Matei Mihai所说的1000个 ),则非常需要动态版本。 SQLFiddle演示 输出值

  • Etity公司 服务 Impl @服务公共类DateFMailServiceImpl实现DateFMailService{ } 存储库 @Repository公共接口DateFMailRepository扩展JpaRepository } 邮件分离器 控制器 保存运行程序 我已经纠正了我的问题。我已经在这里粘贴了所有与我的问题相关的代码。对于初学者,我只想将存储库的查询结果输出到控制台。但在我刚刚

  • 我怀疑存在性能问题,特别是当长时间运行的API击中控制器时。 是否可以将作业作为单独的进程。让spring boot应用程序具有繁重工作的最佳实践是什么。

  • 我有两份清单: 我想要一个新的名单,比如: 我尝试了以下方法: 但有一些严重的错误