2013-07-17 4 views
4

Есть несколько других запросов stackoverflow по этой теме, но ни один из них не имеет удовлетворительного ответа.В sqlite3: скопируйте столбец из одной таблицы в другую таблицу

У меня есть таблица BeerReviews, в которой отсутствует столбец (review_text), а другая таблица BeerReviewsWithText, которая не имеет другого столбца (имя пивоварни). В противном случае строки таблицы упорядочиваются одинаково, поэтому я хотел бы просто добавить столбец brewery_name из BeerReviews в BeerReviewsWithText.

запускает sqlite3 как:

sqlite3 beer_rewiews_with_text.sqlite 

Тогда я прилагаю таблицу обзоров пива через:

attach 'beer_reviews.sqlite' as BR 

я добавил пустую колонку в BeerReviewsWithText через:

alter table BeerReviewsWithText add column beer_brewername varchar; 

Multipleother вопросы предлагают использовать вставку для заполнения столбца, но это добавляет новые строки в таблицу, заполняя только столбец 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_ долгое время: ' update main.BeerReviewsWithText set beer_brewername = (выберите brewery_name из BR.BeerReviews, где brewery_id = main.BeerReviewsWithText.beer_brewerid); ' Поля brewery_id и beer_brewerid все соответствуют строке в строке, но не являются уникальными идентификаторами по строкам, поскольку каждая пивоварня имеет много обзоров. Надеюсь, все в порядке? –

+0

Пока идентификатор пивоваренного завода однозначно идентифицирует название пивоваренного завода, все в порядке. Для эффективного поиска вам нужен индекс в столбце 'brewery_id'. –

+0

После добавления индексов в оба столбца id обновление выполнялось в разумные сроки. Мне нужно будет немного почитать о том, как это ускоряется. Еще раз спасибо! –

Смежные вопросы