0

だから私はこのアプリに取り組んでいます。サプライヤーがあり、各サプライヤーには多くのスコアがあり、各スコアには詳細があります。サプライヤーのスコアを入力する方法は 2 つあります。1 つはフォームによるもので、もう 1 つは Excel のアップロードです。現在、単一のサプライヤーを更新するスプレッドシートを介してアップロードし、すべてのサプライヤーの複製を作成しているリスト全体をアップロードする人がいます。

私はこのSQL文を書きました。注: スコアを一意にするのは、1. その ID と 2. valid_from と valid_until の日付の組み合わせです。

def remove_old_duplicates
  remove_dup = "DELETE s1 FROM `sms_development`.`scores` s1, `sms_development`.`scores` s2 WHERE s1.supplier_id = s2.supplier_id AND s1.valid_from = s2.valid_from AND s1.valid_until = s2.valid_until AND s1.id < s2.id;"

  ActiveRecord::Base.connection.execute remove_dup
end

基本的に、これが行うことになっているのは、テーブルを取得してそれ自体と結合し、サプライヤーが同じで、valid_from 属性と valid_until 属性が同じであるすべてのスコアを探すことです。次に、最大の ID 番号を持つものを探し、残りを削除します。唯一のことは、それらを削除しないことです。ワークベンチでクエリを実行すると、アプリではなく正常に機能していると表示されます。新しいデータがインポートされた直後にこのクエリを実行しますか? これを引き起こしている可能性のあるアイデアはありますか?

注:created_at属性ではなくID番号に基づいている理由は、フィールド内でスコアを作成するとRailsがcreated_at属性を提供するためです。ExcelアップロードはSQL挿入を使用するため、その属性を取得しないためです。 ID は一意です。ID が大きいほどレコードが新しいと考えました

4

2 に答える 2

1

あなたのクエリは私には有効に見えません - 次のようにクエリを書き直すことができます:

DELETE FROM `sms_development`.`scores`
WHERE id NOT IN (
  SELECT MAX(id) FROM `sms_development`.`scores`
  GROUP BY supplier_id, valid_from, valid_until
)
于 2013-04-10T18:30:21.567 に答える