私があなたの質問で何かを逃したのでない限り、あなたは単に更新する必要があります:
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
にすることで、最初の更新のソリューションが適切に機能し、上記の一意性違反が防止されます。