【问题标题】:Rails Deleting SQL result from inner joinRails从内部连接中删除SQL结果
【发布时间】:2012-11-13 12:37:33
【问题描述】:

我有两个表 Accounts 和 Details。

一个帐户有很多详细信息。

其中一个细节是公司规模。他们的排名是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 语句真的很陌生,因此感谢您的帮助。

【问题讨论】:

    标签: sql ruby-on-rails migration


    【解决方案1】:

    您可以使用 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
    

    【讨论】:

    • 你先生应该被封为爵士!哇,这真是解决问题的好方法!
    【解决方案2】:

    类似

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

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

    【讨论】:

      【解决方案3】:

      好吧,这条 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
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-11
        • 2012-08-15
        • 2014-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多