2012-04-17 72 views
0

我有两个表:product(product_id,date)和sex(product_id,sex)。我该如何解决这个DELETE查询?

我想从产品表中删除所有带有此product_id和sex = 1的性别表中存在行的product_id的产品。

我也希望从性别表中删除所有包含我从产品表中删除的行中包含的product_id的行。执行

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语句之前(这可能会删除每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; 

测试给我一个语法错误。我注意到here 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; 

回答

1

固定的,我认为你正在寻找CREATE TEMPORARY TABLE创建表,而不是DECLARE

有关在MySQL中创建表的更多信息,请参阅this page

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

+0

谢谢,它w现在开始。 – jela 2012-04-17 18:06:02

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

+0

谢谢我还没有实际执行DELETE,所以我没有意识到这个问题。我想知道使用NATURAL JOIN和INNER JOIN的目的是什么。文档建议NATURAL JOIN是使用两个表中存在的所有列的INNER JOIN。如果是这样,使用NATURAL JOIN时是否有必要使用WHERE子句? – jela 2012-04-17 18:23:58

+0

@jela'NATURAL JOIN'是空格(注意缺少'ON子句'),因为当两个表具有相同的列名时,即两个表中的'product_id'是相同的名称,所以MySQL可以算出它。 – Ozzy 2012-04-17 18:28:20

+0

是否可以从'DELETE'查询中删除'WHERE'子句,因为'NATURAL JOIN'会在两个表的'product_id'列自动'JOIN'? – jela 2012-04-17 18:46:22