0

アカウントと詳細の2つのテーブルがあります。

アカウントには多くの詳細があります。

詳細の1つは会社の規模です。それらは1から7までランク付けされます。サイズが6のすべてのアカウントを削除したいので、サイズ7のアカウントがすべてサイズ6に変更されるようにアカウントを更新したいので、基本的にシステムからサイズ6の会社を削除します。移行でこれを行うことを考えています。

class RemoveEmeAccounts < ActiveRecord::Migration
  def change
  ActiveRecord::Base.connection.execute("*****")
  ActiveRecord::Base.connection.execute("Update details set size = 6 where size = 7")
  end
end

問題は、サイズが6の会社を削除するSQLステートメントです。私はこのようなことを考えていました。

ActiveRecord::Base.connection.execute("DELETE accounts INNER JOIN details ON accounts.id=details.account.id WHERE details.size = 6")

しかし、それは私には面白そうです。私はSQLステートメントに本当に慣れていないので、どんな助けでもありがたいです。

4

3 に答える 3

2

何かのようなもの

DELETE accounts 
from details INNER JOIN accounts ON accounts.id = details.account_id
WHERE details.size = 6

ただし、これにより、詳細テーブルに孤立したレコードが残ることに注意してください

于 2012-11-13T12:58:01.140 に答える
2

このタスクは、ActiveRecordAPIを使用して実行できます。(データベース間の互換性のために)アプリケーション内のプレーンSQLステートメントの量を常に最小限に抑えるようにしてください。

ActiveRecord::Base.transaction do
  Account.joins(:details).where(:size => 6).delete_all
  Account.joins(:details).where(:size => 7).update_all(:size => 6)
end
于 2012-11-13T12:58:03.650 に答える
1

まあ、このSQLステートメントは機能します。ここでは、内側のSELECTを作成して必要なすべてのIDを取得し、それを外側のDELETEで使用します。

DELETE FROM accounts 
WHERE id IN 
(
  SELECT accounts.id FROM accounts 
  INNER JOIN details ON accounts.id = details.account_id 
  WHERE details.size = 6
)
于 2012-11-13T12:52:36.103 に答える