2012-04-17 5 views
0

商品(商品ID、日付)と性別(商品ID、性別)の2つのテーブルがあります。このDELETEクエリはどのように修正できますか?

このproduct_idとsex = 1のセックステーブルに行が存在するproduct_idを持つすべての商品を商品表から削除します。

また、商品テーブルから削除している行の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文を実行する前

SELECT * FROM @recordsToDelete; 

でテストします

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; 

を持っています私に構文エラーを与えています。私はhere DECLAREがBEGIN/END複合文を必要としていることを書き留めていますが、私はそれを正しく定式化できません。私のミスを修正するにはどうすればいいですか?

EDIT:

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

を介して固定

は、私はあなたの代わりにDECLAREのあなたのテーブルを作成するためにCREATE TEMPORARY TABLEを探していると思います。

MySQLでテーブルを作成する方法の詳細については、this pageを参照してください。

使用している構文は、MySQLではなくMS SQLサーバーのようです。 MySQLでは、DECLAREがローカル変数、条件、ハンドラ、およびカーソルに使用されますが、ではなく、テーブルの作成にはが使用されます。

+0

ありがとうございます今、orks。 – jela

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; 

Btw、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

+0

@jela 'NATURAL JOIN'は両方のテーブルが同じカラム名を持っている場合(つまり、' product_id'が両方のテーブルで同じ名前であるため)、MySQLはそれを理解することができます。 – Ozzy

+0

これは、 'NATURAL JOIN'が2つのテーブルの' product_id'カラムに自動的に 'JOIN'するので' DELETE'クエリから 'WHERE'句を削除することが可能ですか? – jela

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

関連する問題