首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >尝试在MySQL中执行删除时出现错误1093

尝试在MySQL中执行删除时出现错误1093
EN

Stack Overflow用户
提问于 2018-03-23 15:36:26
回答 2查看 65关注 0票数 0

对于这个查询,请帮我一点忙。当尝试在MySQL中执行delete时,它返回一个错误:"MySQL错误1093 -无法在FROM子句中为更新指定目标表“。除此之外,select语句可以很好地工作。脚本如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELETE
  FROM redcap_data
WHERE record IN (SELECT DISTINCT
  redcap_data.record,
  redcap_data.field_name,
  redcap_data.value
FROM redcap_metadata
  INNER JOIN redcap_data
    ON redcap_metadata.project_id = redcap_data.project_id
  INNER JOIN redcap_events_metadata
    ON redcap_data.event_id = redcap_events_metadata.event_id
  INNER JOIN redcap_events_arms
    ON redcap_events_metadata.arm_id = redcap_events_arms.arm_id
WHERE (redcap_data.project_id = '50'
AND redcap_events_arms.arm_num = '6'
AND redcap_data.record IN ('record_ids go here')
))
EN

回答 2

Stack Overflow用户

发布于 2018-03-23 15:50:01

尝试对正在使用as IN子句而不是IN子句的subselect使用内连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    DELETE r.*
      FROM redcap_data r
    INNER JOIN  (
      SELECT DISTINCT
      redcap_data.record,
      redcap_data.field_name,
      redcap_data.value
    FROM redcap_metadata
      INNER JOIN redcap_data
        ON redcap_metadata.project_id = redcap_data.project_id
      INNER JOIN redcap_events_metadata
        ON redcap_data.event_id = redcap_events_metadata.event_id
      INNER JOIN redcap_events_arms
        ON redcap_events_metadata.arm_id = redcap_events_arms.arm_id
    WHERE (redcap_data.project_id = '50'
    AND redcap_events_arms.arm_num = '6'
    AND redcap_data.record IN ('record_ids go here')
    )) t ON r.record = t.record
票数 1
EN

Stack Overflow用户

发布于 2018-03-23 15:53:53

这是MySQL中记录在案的限制。

一种解决方法是使用内联视图(派生表),并在联接操作中引用该视图。

将其写入为SELECT first

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT t.*
  FROM target_table t
  JOIN ( SELECT q.id
           FROM target_table q 
           JOIN ... r
             ON ...
          WHERE ... 
          GROUP BY ... 
         HAVING ...
       ) s
    ON s.id = t.id 

然后我们可以将其转换为DELETE语句。根据我的经验,内联视图在外部查询中提供了足够的target_table分隔,因此不会引发MySQL错误。

在外部查询运行时,物化派生表s的查询已经执行。MySQL执行的操作与此类似(不完全是这样,但这说明了模式,我们如何看待派生表……

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TEMPORARY TABLE _s_ ... ;
INSERT INTO _s_ (...) SELECT ... FROM target_table q ... ;

DELETE t.*
  FROM target_table t
  JOIN _s_ 
    ON ... 
;

DROP TEMPORARY TABLE _s_ ... ;

在DELETE语句运行时,在前面的SELECT语句中引用target_table并不重要。实现临时表%s的工作已经完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49453366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文