请稍微帮助此查询。当尝试在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')
))
答案 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 的工作已经完成。