2

メガタイトルでごめんなさい...私は十分に説明しようとしていました。いくつかの誤ったデータを含むイベント出席データを含むテーブルがあります。テーブル定義は次のようなものです。

id (row id)
date
company_name
attendees

ある日付に対して、company_nameとdateに一致する2つのエントリがありますが、1つはattendies = 0で、もう1つはattendies>0である場合があります。そのような場合、出席者=0の場合は破棄したいと思います。

削除中に同じテーブルに参加できないことはわかっているので、このクエリは、私が達成したいことを示す擬似コードであると考えてください。

DELETE FROM attendance a WHERE a.attendees=0 AND a.date IN (SELECT b.date FROM attendance b WHERE b.attendees > 0 AND b.company_name = a.company_name);

また、削除する行のIDを一時テーブルに入力しようとしましたが、IN(SELECT ...)句が原因でクエリがハングします。私のテーブルには数千行あるので、CPUを最大限に活用してからタイムアウトします。

4

1 に答える 1

2

この醜いことはうまくいくはずです(エイリアス許可を使用してエラーを回避しYou can't specify target table for update in FROM clauseます)

DELETE FROM attendance
WHERE (attendees, date, company_name)
IN (SELECT c.a, c.d, c.c 
    FROM
     (SELECT MIN(attendees) a, date d, company_name c
      FROM attendance
      GROUP BY date, company_name
      HAVING COUNT(*) > 1) as c);

SqlFiddle

于 2012-10-10T19:24:36.797 に答える