0

perl、python、またはMySQLを使用してこれらのことを行う方法は知っていますが、sqliteでこれを行う方法を理解できないようです。ここで誰かが助けてくれることを願っています。

更新された注: 私は sqlite バージョン 2.8.17 に制限されています

私は持っている:

create table Ta (
    a1 INTEGER PRIMARY KEY,
    a2 VARCHAR(12) );

create table Tb (
    b1 VARCHAR(12) PRIMARY KEY, 
    b2 INTEGER, 
    b3 VARCHAR(8), 
    b4 VARCHAR(8) ); 

コマンドラインと基本的なSQLスクリプトでやりたいことは次のとおりです。Tbのすべての行を調べ、b2 == a1の場合、b1に格納されている値をa2の対応する値に置き換えたいと思います.

単純化すると次のようになります: b1 = Ta から a2 を選択 a1 = b2

何か案は?

4

2 に答える 2

1

これはどう?

UPDATE Tb
    SET
        b1 = (SELECT a2 
              FROM Ta
              WHERE Tb.b2 = Ta.a1 )
    WHERE
        EXISTS (
            SELECT *
            FROM Ta
            WHERE Tb.b2 = Ta.a1 );
于 2012-04-28T15:24:04.417 に答える
0

私があなたの質問で何かを逃したのでない限り、あなたは単に更新する必要があります:

update tb set b1 = (select a2 from Ta where a1 = b2);

更新1

OPは彼女/彼がsqlite2.8.17を使用していると述べているので、「クロステーブル」アップデートはサポートされていません。

回避策を提供するこのリンクを見つけました。結合されたフィールドが主キーである必要があります。これは、この質問の場合です。

ステートメントは次のとおりです。

insert or replace into tb (b2, b1) 
select ta.a1, ta.a2 
from ta, tb 
where ta.a1=tb.b2;

それ以外の方法でテストしていないので、エラーなしで実行されることを確認します。私のSQLの知識の限りでは、この更新の前に投稿した更新ステートメントと同じように動作するはずです。

更新2

OPが指摘したように、上記には問題があります。Tbの既存のレコードを更新するのではなく、新しいレコードを挿入します。OPがやろうとしていることに矛盾が見られます。

sqlite3.xyが使用されていると仮定します。簡単なupdateステートメントで作業を完了できます。問題は、の複数のレコードが:に存在するTb同じb2値を持つとすぐに失敗することです。Ta.a1

sqlite> create table ta (
   ...>     a_key INTEGER PRIMARY KEY,
   ...>     a_val TEXT);
sqlite> create table tb (
   ...>     b_key TEXT PRIMARY KEY,
   ...>     b_val INTEGER);
sqlite> insert into ta values (1, 'a');
sqlite> insert into tb values ('z', 1);
sqlite> insert into tb values ('y', 1);
sqlite> update tb set b_key=(select a_val from ta where a_key=b_val); 
Error: column b_key is not unique

したがって、ここでの解決策は、Tb1.b2独自のものにすることです。

create table Tb (
    b1 VARCHAR(12) PRIMARY KEY, 
    b2 INTEGER UNIQUE, 
    b3 VARCHAR(8), 
    b4 VARCHAR(8));

一意Tb.b2にすることで、最初の更新のソリューションが適切に機能し、上記の一意性違反が防止されます。

于 2012-04-28T16:55:41.033 に答える