Mysql 如何修复此删除查询?
我有两张表:productsproduct\u id,date和sexproduct\u id,sex 我想从products表中删除所有具有product_id的产品,该产品在sex表中存在一行,并且该product_id和sex=1 我还希望从sex表中删除我要从products表中删除的一行中包含product_id的所有行。这可能会删除每个产品标识的多行 到目前为止我有Mysql 如何修复此删除查询?,mysql,Mysql,我有两张表:productsproduct\u id,date和sexproduct\u id,sex 我想从products表中删除所有具有product_id的产品,该产品在sex表中存在一行,并且该product_id和sex=1 我还希望从sex表中删除我要从products表中删除的一行中包含product_id的所有行。这可能会删除每个产品标识的多行 到目前为止我有 DECLARE @recordsToDelete AS TABLE( int product_id ); INSER
DECLARE @recordsToDelete AS TABLE(
int product_id
);
INSERT INTO @recordsToDelete( product_id )
SELECT product_id
FROM products p
JOIN sex s
ON p.product_id = s.product_id
WHERE s.sex = 1;
然后,我将使用
SELECT * FROM @recordsToDelete;
执行前
DELETE FROM products
WHERE product_id IN ( SELECT product_id FROM @recordsToDelete );
DELETE FROM sex
WHERE product_id IN ( SELECT product_id FROM @recordsToDelete );
但是DECLARE语句给了我一个语法错误。我注意到DECLARE需要一个BEGIN/END复合语句,但我无法正确地表达它。我怎样才能改正我的错误
编辑:
固定通孔
CREATE TEMPORARY TABLE recordsToDelete(
product_id INT
);# MySQL returned an empty result set (i.e. zero rows).
INSERT INTO recordsToDelete( product_id )
SELECT p.product_id
FROM products p
JOIN sex s ON p.product_id = s.product_id
WHERE s.sex =1;# Affected rows: 275
SELECT *
FROM recordsToDelete;
我认为您正在寻找创建临时表来创建表,而不是声明 有关在MySQL中创建表的更多信息,请参阅
您使用的语法似乎适用于MS SQL server,而不是MySQL。在MySQL中,用于局部变量、条件、处理程序和游标,但不用于创建表。我认为您正在寻找创建临时表来创建表,而不是声明 有关在MySQL中创建表的更多信息,请参阅 您使用的语法似乎适用于MS SQL server,而不是MySQL。在MySQL中,用于局部变量、条件、处理程序和游标,但不用于创建表。试试这个
CREATE TEMPORARY TABLE tempTable
SELECT product_id
FROM products AS p
INNER JOIN sex AS s
ON p.product_id = s.product_id
WHERE s.sex = 1;
DELETE FROM products AS p
NATURAL JOIN tempTable AS t
WHERE p.product_id = t.product_id;
顺便说一句,您不能从同一个表中删除,请从同一个表中选择*
我引述:
当前,不能从表中删除,也不能从子查询中的同一表中选择
试试这个
CREATE TEMPORARY TABLE tempTable
SELECT product_id
FROM products AS p
INNER JOIN sex AS s
ON p.product_id = s.product_id
WHERE s.sex = 1;
DELETE FROM products AS p
NATURAL JOIN tempTable AS t
WHERE p.product_id = t.product_id;
顺便说一句,您不能从同一个表中删除,请从同一个表中选择*
我引述:
当前,不能从表中删除,也不能从子查询中的同一表中选择
我认为您可以通过简单的多任务删除获得所需:
delete sex, products from products p
inner join sex s on p.id=s.product_id
where s.sex=1
您还可以考虑在表上使用级联删除:
我认为您可以通过简单的多任务删除获得所需:
delete sex, products from products p
inner join sex s on p.id=s.product_id
where s.sex=1
您还可以考虑在表上使用级联删除:
谢谢,我还没有真正执行删除操作,所以我没有意识到这个问题。我想知道使用自然连接和内部连接的目的是什么。文档建议自然联接是使用两个表中存在的所有列的内部联接。如果是这样,那么在使用自然连接时是否需要使用WHERE子句?@jela NATURAL JOIN是一种速记方法,请注意,当两个表都有相同的列名时,即product_id在两个表中都是相同的名称时,缺少ON子句,以便MySQL能够找到答案。那么是否可以从DELETE查询中删除WHERE子句,因为自然连接将自动连接两个表中的product_id列?否!!!在您的例子中,WHERE子句仅在p.product_id&t.product_id上的temp表中存在匹配项的情况下才从products表中删除。如果删除WHERE子句,您的意思是从联接表中删除所有记录,那么整个products表将消失。但是联接表是否只包含如果条件已经满足,那么自然连接会自动连接到产品id上?当然,我还没有真正尝试过这个,因为我意识到我不理解一些东西。我不明白为什么查询不能被写为DELETE FROM products,因为p.product\u id=t.product\u id上的p internal JOIN可诱惑为t,或者,如果可以,为什么这与p NATURAL JOIN Attentiable as t从产品中删除不同,因为Attentiable只包含product_id值,其在products表中的行应该被删除。谢谢,我还没有实际执行删除,所以我没有意识到这个问题。我想知道使用自然连接和内部连接的目的是什么。文档建议自然联接是使用两个表中存在的所有列的内部联接。如果是这样,那么在使用自然连接时是否需要使用WHERE子句?@jela NATURAL JOIN是一种速记方法,请注意,当两个表都有相同的列名时,即product_id在两个表中都是相同的名称时,缺少ON子句,以便MySQL能够找到答案。那么是否可以从DELETE查询中删除WHERE子句,因为自然连接将自动连接两个表中的product_id列?否!!!在您的例子中,WHERE子句仅在p.product_id&t.product_id上的temp表中存在匹配项的情况下才从products表中删除。如果删除WHERE子句,您的意思是从联接表中删除所有记录,那么整个products表将消失。但是联接表是否只包含如果条件已经满足,那么自然连接会自动连接到产品id上?当然,我还没有真正尝试过这个,因为我意识到我不理解一些东西。我不明白为什么查询不能被写,从产品中删除,作为p内部连接,作为p上的t product_id=t.product_id,或者,如果可以的话,为什么这与从products中删除p NATURAL JOIN Attentiable as t不同,因为Attentiable只包含product_id值,products表中的行应该被删除。