2012-11-13 32 views
0

我有兩個表帳戶和詳細信息。Rails從內部連接刪除SQL結果

一個帳戶有很多細節。

其中的一個細節是公司規模。他們從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

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

你先生應該是騎士!哇,這是一個非常寶貴的解決問題的方式! – TheLegend

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 
) 
+0

謝謝你的幫助好先生 – TheLegend

2

喜歡的東西

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

但是,請記住,這將留下孤立的記錄您的詳細信息表

+0

感謝您的幫助! – TheLegend