在sqlite3中:将一个表的列复制到另一个表中。

10

关于这个话题,stackoverflow上有几个相关的问题,但是它们都没有令人满意的答案。

我有一个名为BeerReviews的表格,缺少一列(review_text),还有另一个名为BeerReviewsWithText的表格,缺少另一列(brewery_name)。除此之外,这两个表格的行是按照相同的顺序排列的,所以我想简单地将BeerReviews中的brewery_name列附加到BeerReviewsWithText中。

我启动sqlite3的方式如下:

sqlite3 beer_rewiews_with_text.sqlite

然后我通过以下方式附加啤酒评论表:
attach 'beer_reviews.sqlite' as BR

我通过以下方式向BeerReviewsWithText添加了一个空列:
alter table BeerReviewsWithText add column beer_brewername varchar;

Multiple other 问题建议使用插入来填充列,但这会将新行附加到表中,仅填充 beer_brewername 列。

insert into BeerReviewsWithText(beer_brewername) select brewery_name from BeerReviews;

相反,更新似乎填充了空值,但是当我运行以下代码(类似于另一个问题的答案)时,所有的beer_brewername值都是相同的:

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

这似乎是奇怪的行为,因为当我运行以下命令时,我得到了预期的酿酒厂名称列表:

select brewery_name from BR.BeerReviews limit 50;

我是sqlite的新手,所以有人能解释一下我做错了什么吗?

1个回答

12

当您将子查询用作表达式时,就像这样:

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

如果您使用子查询,那么只有子查询返回的第一条记录将被使用。

您必须编写一个子查询,返回单个记录,但对于外部表中的每个记录来说都是不同的记录。这被称为相关子查询:

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

(这假设您有一个 ID 列作为主键。)


好的,我正在运行以下代码,这需要非常长的时间: update main.BeerReviewsWithText set beer_brewername=(select brewery_name from BR.BeerReviews where brewery_id = main.BeerReviewsWithText.beer_brewerid);brewery_id和beer_brewerid字段在每一行都匹配,但不是跨行的唯一标识符,因为每个酿酒厂都有很多评论。希望这没问题? - Alexander Tronchin-James
2
只要酿酒厂ID能唯一地标识酿酒厂名称,这就可以了。为了进行高效的查找,您需要在“brewery_id”列上建立索引。 - CL.
在两个id列上添加索引后,更新操作运行时间合理。我需要再多了解一下这些如何提高速度。再次感谢! - Alexander Tronchin-James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接