关于此主题还有其他几个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个问题建议使用insert填充列,但这会向表中添加新行,仅填充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的新手,所以有人可以解释我的错误吗?
答案 0 :(得分:9)
当您使用子查询作为表达式时,如下所示:
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
列作为主键。)