2012-03-30 4 views
1

実行時に例外をスローしているDBテーブルから重複エントリを削除するには、次のファイル "dupeExtracter.rb"があります。DBテーブルから重複エントリを削除するRubyスクリプトSQLite3クエリで例外をスローする

それをデバッグしたり、それを修正する方法

/Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.5/lib/sqlite3/database.rb:91:in `initialize': near "L": syntax error (SQLite3::SQLException) 
from /Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.5/lib/sqlite3/database.rb:91:in `new' 
from /Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.5/lib/sqlite3/database.rb:91:in `prepare' 
from /Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.5/lib/sqlite3/database.rb:134:in `execute' 
from dupeExtracter.rb:22:in `block in <main>' 
from dupeExtracter.rb:20:in `each' 
from dupeExtracter.rb:20:in `<main>' 

イムわからない:

require 'sqlite3' 

db = SQLite3::Database.new('development.sqlite3') 
db.results_as_hash = true; 

#This query will return the lowest id of every entry that occurs more than once in the DB 
#Entries that occur only once will NOT be in this resultset 
#In other words this query will return the lowest id of every Duplicate in the DB 
#It takes all these entries and populates the duplicates table with them 
rows = db.execute("SELECT L1.* FROM listings L1 
WHERE L1.id = 
(SELECT MIN(L2.id) FROM Listings L2 WHERE 
L1.name = L2.name 
AND L1.telephone = L2.telephone 
AND L1.latitude = L2.latitude 
AND L1.longitude = L2.longitude) 
") 


rows.each do |row| 

    db.execute("DELETE FROM listings L 
    WHERE L.id <> row['id'] 
    AND L.name = row['name'] 
    AND L.telephone = row['telephone'] 
    AND L.latitude = row['latitude'] 
    AND L.longitude = row['longitude'] 
    ") 

end 

この は例外です。いくつかの方法を試しましたが、うまくいかないようです。

EDITを助けてくださいが示唆され、この下の答えの1の後、これに上記のループを変更しました。しかし、イムはまだ例外を取得:

rows.each do |row| 

db.execute("DELETE FROM listings 
WHERE id <> row['id'] 
AND name = row['name'] 
AND telephone = row['telephone'] 
AND latitude = row['latitude'] 
AND longitude = row['longitude'] 
") 

例外:例外は、トークン「L」の近くに誤りがあります、そしてこのトークンのインスタンスが1つだけあなたのSQLにありますことを示しています

/Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.5/lib/sqlite3/database.rb:91:in `initialize': near "['id']": syntax error (SQLite3::SQLException) 
from /Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.5/lib/sqlite3/database.rb:91:in `new' 
from /Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.5/lib/sqlite3/database.rb:91:in `prepare' 
from /Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/sqlite3-1.3.5/lib/sqlite3/database.rb:134:in `execute' 
from dupeExtracter.rb:22:in `block in <main>' 
from dupeExtracter.rb:20:in `each' 
from dupeExtracter.rb:20:in `<main>' 
+0

この質問に否定的な評価を与えた人は、少なくともこの評価を説明する礼儀を示すことができます。 – banditKing

+0

私はそうではありませんでしたが、巨大なテキストを使用していたように見せかけるようなフォーマットになっていないと思います。 –

+0

ありがとうございます、モデレータはちょっと悩ましいようです。私はこれに新しいので、まだ学習。ありがとう。 – banditKing

答えて

1

ので、 SQLiteはDELETE文のエイリアスを受け入れないように見えます。 syntax diagramのクイックチェックは、実際には、エイリアスがDELETEに対して許可されていないことを示します。

しかし、一つの文でこれを行うことを検討:

DELETE FROM listings WHERE EXISTS 
    (SELECT * FROM Listings L2 
     WHERE id  < listings.id 
     AND name  = listings.name 
     AND telephone = listings.telephone 
     AND latitude = listings.latitude 
     AND longitude = listings.longitude) 

これは、下のidを持つリストテーブルに似た記録を持っているリスト内のすべてのレコード(つまり、すべてが、最低のid行のために削除されますすべてのコホート)。

+0

ご清聴ありがとうございました。エイリアスなしで同じスクリプトを試した後、上記の編集を参照してください。私はまだ例外があります。これは難しいです! – banditKing

+0

編集されたバージョンが表示されません。 SQLiteは、DELETE文のすべてのインスタンスでLとLを削除するよう指示しています。しかし、あなたは1つのステートメントでこれを行うことができます、私は私の答えを編集します。 –

+0

ちょうど編集を掲載しました。待ち時間をおかけして申し訳ありません。あなたのすべての協力に感謝します。 Im私はこれを解決することができることを望んで、Imは解決にとても近づく。 – banditKing

関連する問題