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

时间:2018-03-23 15:36:26

标签: mysql

请稍微帮助此查询。当尝试在MySQL中执行删除时,它会返回错误:" MySQL错误1093-无法在FROM子句"中指定更新目标表。否则,select语句可以正常工作。这是脚本:

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')
))

2 个答案:

答案 0 :(得分:1)

尝试在您使用的子选择上使用内连接作为IN子句而不是IN子句

    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 :(得分:0)

它是MySQL中记录的限制。

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

首先将其写为SELECT

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执行的操作类似于此(不完全是这样,但这说明了模式,我们如何考虑派生表...

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 的工作已经完成。