0

我有两个表:products(product_id,date) 和 sex(product_id,sex)。

我想从 products 表中删除所有具有 product_id 的产品,在该 product_id 和 sex=1 的 sex 表中存在一行。

我还希望从 sex 表中删除包含 product_id 的所有行,这些行包含在我从 products 表中删除的行之一中。(这可能会删除每个 product_id 的多行。)

到目前为止我有

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;
4

3 回答 3

1

我认为您正在寻找CREATE TEMPORARY TABLE创建表而不是DECLARE.

有关在 MySQL 中创建表的更多信息,请参阅此页面

您使用的语法似乎适用于 MS SQL 服务器,而不是 MySQL。在 MySQL 中,DECLARE用于局部变量、条件、处理程序和游标,但用于创建表。

于 2012-04-17T17:57:13.430 回答
1

试试这个?

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 FROM same_table (SELECT * FROM same_table)

我引用:
Currently, you cannot delete from a table and select from the same table in a subquery.

http://dev.mysql.com/doc/refman/5.5/en/delete.html

于 2012-04-17T18:06:44.400 回答
1

我认为你可以从一个简单的多表删除中得到你想要的:

delete sex, products from products p 
inner join sex s on p.id=s.product_id
where s.sex=1

你也可以考虑on cascade delete在你的桌子上使用:http: //dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

于 2012-04-17T18:20:40.087 回答