我需要根据相关子查询的同一个表中的列条件查询同一个表的删除语句。
我无法直接运行delete语句并检查mysql中相关子查询的相同表的条件。
我想知道使用临时表是否会影响mysql的内存/性能?
任何帮助都将受到高度赞赏。
感谢。
答案 0 :(得分:28)
您可以通过将“where”查询作为内联来自表格,让mysql为您执行临时表。
这个原始查询将为您提供可怕的“您无法在FROM子句中指定更新目标表”:
DELETE FROM sametable
WHERE id IN (
SELECT id FROM sametable WHERE stuff=true
)
重写它以使用内联临时变为......
DELETE FROM sametable
WHERE id IN (
SELECT implicitTemp.id from (SELECT id FROM sametable WHERE stuff=true) implicitTemp
)
答案 1 :(得分:15)
你的问题真的不清楚,但我猜你有一个相关的子查询,你在从DELETE锁定的同一个表中执行SELECT时遇到了麻烦。例如,删除除文档的最新版本之外的所有版本:
DELETE FROM document_revisions d1 WHERE edit_date <
(SELECT MAX(edit_date) FROM document_revisions d2
WHERE d2.document_id = d1.document_id);
这是MySQL的一个问题。
使用MySQL多表删除语法可以解决这些类型问题的许多示例:
DELETE d1 FROM document_revisions d1 JOIN document_revisions d2
ON d1.document_id = d2.document_id AND d1.edit_date < d2.edit_date;
但这些解决方案最好是根据具体情况进行设计,因此如果您编辑问题并更具体地了解您尝试解决的问题,也许我们可以为您提供帮助。
在其他情况下,您可能是对的,使用临时表是最简单的解决方案。
答案 2 :(得分:1)
不能直接运行delete语句并检查同一个表的条件
当然可以。如果要在检查col1 = 'somevalue'
的条件时从table1中删除,可以执行以下操作:
DELETE
FROM table1
WHERE col1 = 'somevalue'
修改的
要使用相关子查询进行删除,请参阅以下示例:
create table project (id int);
create table emp_project (id int, project_id int);
insert into project values (1);
insert into project values (2);
insert into emp_project values (100, 1);
insert into emp_project values (200, 1);
/* Delete any project record that doesn't have associated emp_project records */
DELETE
FROM project
WHERE NOT EXISTS
(SELECT *
FROM emp_project e
WHERE e.project_id = project.id);
/* project 2 doesn't have any emp_project records, so it was deleted, now
we have 1 project record remaining */
SELECT * FROM project;
Result:
id
1
答案 3 :(得分:0)
使用要删除的值创建临时表,然后在删除时将其连接到表。在这个例子中,我有一个带有ID列的“Games”表。我将删除大于3的ID。我将首先在临时表中收集目标,以便稍后报告。
DECLARE @DeletedRows TABLE (ID int)
insert
@DeletedRows
(ID)
select
ID
from
Games
where
ID > 3
DELETE
Games
from
Games g
join
@DeletedRows x
on x.ID = g.ID
答案 4 :(得分:-1)
您可以从同一个表中删除。删除声明如下
DELETE FROM table_name
WHERE some_column=some_value
答案 5 :(得分:-1)
你的意思是:
DELETE FROM table WHERE someColumn = "someValue";
这绝对有可能,read about the DELETE
syntax in the reference manual。