2012-04-17 67 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