Rails从内部联接中删除SQL结果

时间:2012-11-13 12:37:34

标签: sql ruby-on-rails migration

我有两个表帐户和详细信息。

帐户有很多细节。

其中一个细节是公司规模。它们的排名是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

问题是sql语句删除大小为6的公司我正在考虑这样的事情

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

但这对我来说很有趣。我是sql语句的新手,所以任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

您可以使用ActiveRecord API完成此任务。您应该始终尝试最小化应用程序内部的纯SQL语句数量(以实现跨数据库兼容性)。

ActiveRecord::Base.transaction do
  Account.joins(:details).where(:size => 6).delete_all
  Account.joins(:details).where(:size => 7).update_all(:size => 6)
end

答案 1 :(得分:2)

这样的东西
DELETE accounts 
from details INNER JOIN accounts ON accounts.id = details.account_id
WHERE details.size = 6

但是,请记住,这会在您的详细信息表格中留下孤立的记录

答案 2 :(得分: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
)