2013-07-17 198 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列添加独立项后,更新在合理的时间内运行。我将不得不多读些关于这些如何加快速度的东西。再次感谢! –

相关问题