2013-07-17 237 views
4

還有幾個關於此主題的其他stackoverflow查詢,但沒有一個具有滿意的答案。在sqlite3中:將列從一個表複製到另一個表

我有一個表BeerReviews,它缺少一列(review_text),另一個表BeerReviewsWithText缺少一個不同的列(brewery_name)。否則,表格行按照相同的方式排序,所以我想簡單地將BeerReviews中的brewery_name列添加到BeerReviewsWithText中。

我啓動sqlite3的是:

alter table BeerReviewsWithText add column beer_brewername varchar; 

Multipleother

attach 'beer_reviews.sqlite' as BR 

我通過添加一個空列BeerReviewsWithText:

sqlite3 beer_rewiews_with_text.sqlite 

然後我通過附加啤酒審查表問題建議使用插入來填充列,但是這個將新行添加到表中,僅填充beer_brewername列。

insert into BeerReviewsWithText(beer_brewername) select brewery_name from BeerReviews; 

相反,更新似乎填補了空值,但是當我運行下面的(類似於another question's answer)所有beer_brewername值是相同的:

update BeerReviewsWithText set beer_brewername=(select brewery_name from BR.BeerReviews); 

這似乎是奇怪的行爲因爲我得到酒廠的名字的預期列表當我運行:

select brewery_name from BR.BeerReviews limit 50; 

我是新來的sqlite的,所以有人可以解釋我在做什麼錯誤?

回答

4

當您使用子查詢作爲一個表達式,像這樣:

UPDATE BeerReviewsWithText 
SET beer_brewername = (SELECT brewery_name 
         FROM BR.BeerReviews) 

則僅由子查詢返回的第一條記錄將被使用。

您必須編寫一個子查詢,該子查詢返回外部表中每條記錄的單個記錄,但不同的記錄。這就是所謂的相關子查詢:(這裏假設你有一個ID列作爲主鍵)

UPDATE BeerReviewsWithText 
SET beer_brewername = (SELECT brewery_name 
         FROM BR.BeerReviews 
         WHERE ID = BeerReviewsWithText.ID) 

+0

好了,我跑這是服用_incredibly_長的時間如下: '更新main.BeerReviewsWithText設置beer_brewername =(選擇從那裏brewery_id = main.BeerReviewsWithText.beer_brewerid BR.BeerReviews brewery_name);' 的brewery_id和beer_brewerid領域的所有匹配行到行,但不跨越行的唯一標識符,因爲每個啤酒廠有很多評論。希望這沒關係? –

+0

只要啤酒廠ID唯一標識啤酒廠名稱,這是可以的。爲了高效查找,您需要'brewery_id'列上的索引。 –

+0

向兩個id列添加獨立項後,更新在合理的時間內運行。我將不得不多讀些關於這些如何加快速度的東西。再次感謝! –

相關問題