2016-11-21 6 views
2

インポートしたCSVファイルを使用してという名前のsqlite3(Clementine)dbテーブルのカラム値をsongsに置き換えたいとします。CSVファイルを使用してテーブル内のすべての列値を更新するにはどうすればよいですか?

CSVファイルには、ターゲットデータベースのフィールド名と一致するヘッダーを持つ3つの列があります。私が "索引付け"したい一般的な列はfilenameです。それは動作しませんでした

update songs 
set lastplayed = (select songsnew.lastplayed 
where songsnew.filename = songs.filename) 
where 
exists (
select * 
from songsnew 
where songsnew.filename = songs.filename 
) 

:SQLiteBrowserを使用して

は、私は別の答えから取られたこのSQLを試してみました。エラーメッセージは言う:私はSQLiteデータベースブラウザにそのSQLを入力していて、それが正しく識別するため、奇数である

no such column: songsnew.lastplayed: update songs 

が... songsnew表の列filename「をポップアップ表示します」。

SQLite3やbashを使用すると、CSVをテーブルとしてインポートすることによってのみこれを実行できますか?どの方法が最も簡単で、どのようにして行われますか?一度に1つずつ何千ものレコードを手動で更新することは望ましくありません。

CREATE TABLE `songs` (
    `title` TEXT, 
    `album` TEXT, 
    `artist` TEXT, 
    `albumartist` TEXT, 
    `composer` TEXT, 
    `track` INTEGER, 
    `disc` INTEGER, 
    `bpm` REAL, 
    `year` INTEGER, 
    `genre` TEXT, 
    `comment` TEXT, 
    `compilation` INTEGER, 
    `length` INTEGER, 
    `bitrate` INTEGER, 
    `samplerate` INTEGER, 
    `directory` INTEGER NOT NULL, 
    `filename` TEXT NOT NULL, 
    `mtime` INTEGER NOT NULL, 
    `ctime` INTEGER NOT NULL, 
    `filesize` INTEGER NOT NULL, 
    `sampler` INTEGER NOT NULL DEFAULT '0', 
    `art_automatic` TEXT, 
    `art_manual` TEXT, 
    `filetype` INTEGER NOT NULL DEFAULT '0', 
    `playcount` INTEGER NOT NULL DEFAULT '0', 
    `lastplayed` INTEGER, 
    `rating` INTEGER, 
    `forced_compilation_on` INTEGER NOT NULL DEFAULT '0', 
    `forced_compilation_off` INTEGER NOT NULL DEFAULT '0', 
    `effective_compilation` TEXT NOT NULL DEFAULT '0', 
    `skipcount` INTEGER NOT NULL DEFAULT '0', 
    `score` INTEGER NOT NULL DEFAULT '0', 
    `beginning` INTEGER NOT NULL DEFAULT '0', 
    `cue_path` TEXT, 
    `unavailable` INTEGER DEFAULT '0', 
    `effective_albumartist` TEXT, 
    `etag` TEXT, 
    `performer` TEXT, 
    `grouping` TEXT 
); 

...と、ここでCSVファイルのインポート後songsnewスキーマです:

ここでは、コメントで要求されたように最初のスキーマsongsです。ここ

CREATE TABLE `songsnew` (
    `filename` TEXT, 
    `playcount` TEXT, 
    `lastplayed` TEXT 
); 
+0

どのようにしてSQLiteBrowserにデータを取得しましたか?あなたがそれをインポートした場合、それはすでにそこにあります。 'sqlite3'コマンドラインシェルに' .schema'の出力を表示します。 –

+0

OK - 上記に追加されました。 – user3447273

+0

コラムがあります。同じデータベースにインポートしましたか? –

答えて

0

ですもっと便利な方法:

with delta(fn, pc, lp) as 
(select a.filename, a.playcount, a.lastplayed from songsnew a) 
update songs set 
    lastplayed = ifnull((select lp from delta where fn = filename), lastplayed), 
    playcount = ifnull((select pc from delta where fn = filename), playcount) 
where filename in (select fn from delta); 

それは

を使用しています曖昧周りを取得するために
  • CTEを、
    with delta(fn, pc, lp) as ...
  • あなたはsongsnewに持っていないかもしれない値を入力する構文、
    ifnull(...)
  • スピードアップするためにWHERE句、
    (他の場所での変更も防ぐことができますが、はるかに遅くなる可能性があります)

songsnew.playcでsongs.playcountを増やしたい場合がありますその場合には、 playcount = ifnull((select playcount+pc from delta where fn = filename), playcount)を使用してください。

オンSQLite 3.18.0 2017-03-28

関連する問題