对于这个查询,请帮我一点忙。当尝试在MySQL中执行delete时,它返回一个错误:"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')
))
发布于 2018-03-23 15:50:01
尝试对正在使用as IN子句而不是IN子句的subselect使用内连接
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
发布于 2018-03-23 15:53:53
这是MySQL中记录在案的限制。
一种解决方法是使用内联视图(派生表),并在联接操作中引用该视图。
将其写入为SELECT first
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的工作已经完成。
https://stackoverflow.com/questions/49453366
复制