2012-04-28 54 views
0

我知道如何使用perl,python甚至MySQL做這些事情,但我似乎無法弄清楚如何用sqlite做到這一點。希望這裏的某個人可以幫忙。sqlite改變使用選擇和從其他表匹配

最新說明:我僅限於源碼版本17年2月8日

我:

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中,我想用a2中的cooresponding值替換b1中存儲的值。

簡化它的東西,如: B1 = A2選擇從鉭爲A1 = B2

任何想法?

回答

1

這個怎麼樣?

UPDATE Tb 
    SET 
     b1 = (SELECT a2 
       FROM Ta 
       WHERE Tb.b2 = Ta.a1) 
    WHERE 
     EXISTS (
      SELECT * 
      FROM Ta 
      WHERE Tb.b2 = Ta.a1); 
+0

之前嘗試過,第二個WHERE中的SELECT語句存在問題。此外,似乎sqlite不知道如何處理像Ta.a1 – user1362978 2012-04-28 19:29:13

0

除非我錯過了你的問題的東西,你只需要更新:

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

更新1

OP提到,她/他是使用SQLite 17年2月8日,所以不支持「交叉表」更新。

我發現這個link它提供了一種解決方法。它要求加入的字段是主鍵,這是這個問題的情況。

以下是該語句:

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

我沒有測試它,否則然後驗證它的執行沒有錯誤。就我的SQL知識而言,它應該與我在此更新之前發佈的更新聲明相同。

UPDATE 2

沒有與上方的問題,因爲OP指出。它將插入新記錄而不是更新Tb中的現有記錄。我現在看到OP正在嘗試做什麼的矛盾:

假設使用了sqlite 3.x.y。一條簡單的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獨特使我的第一次更新的解決方案正常工作,防止上述暴露的唯一性。

+0

這就是我認爲...但sqlite提供了一個錯誤:「沒有這樣的列:b2」。看來它正在Ta中尋找它,像「Ta.b2」這樣的語法似乎不適用於sqlite。 – user1362978 2012-04-28 18:59:28

+0

什麼是sqlite版本? – 2012-04-28 19:06:27

+0

2.8.17,我不幸無法更新或移動到其他東西。 – user1362978 2012-04-28 19:32:46

相關問題