@CityzenUNDEAD

Можно ли корректно заполнить создаваемое поле таблицы данными из другой таблицы?

Приветствую!
Имеются 2 таблицы (упрощено).
Таблица А
create table TableA
(
    Id serial PRIMARY KEY,
    Name CHARACTER varying(30),
    Number INTEGER
)


И таблица B
create table TableB
(
    Id serial PRIMARY KEY,
    Name CHARACTER varying(30),
    Desc CHARACTER(30)
)


TableB это по факту некоторый справочник имен. А в TableA в поле Name так же содержаться имена для каждой строки.
Все возможные значения поля Name из таблицы TableA, присутствуют в таблице справочнике имен TableB.
Задача в следующем: в таблицу TableA нужно добавить новое поле, внешний ключ TableBId который должен указывать на соответствующий Id в таблице TableB. Связь между таблицами должна установиться на основе поля Name. То есть должна быть проверка если
TableA.Name = TableB.Name, тогда TableA.TableBId = TableB.Id.
И когда все строки между этими двумя таблицами получат связи, поле TableA.Name можно удалять как не нужное.
Все это желательно сделать одним скриптом.
Но я пока не понимаю как это сделать, и реально ли это.
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
UPDATE TableA 
SET tableB_Id = TableB.Id
FROM TableB
WHERE TableA.Name = TableB.Name;


fiddle
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
UPDATE TableA LEFT JOIN (
SELECT MIN(Id) AS id, Name FROM TableB GROUP BY Name
) AS b
ON TableA.Name = b.Name
SET TableA.TableBId = b.id

Соотвественно, до этого запроса - ALTER TABLE с добавлением столбца TableBId, после - ALTER TABLE с удалением Name.
Можно сделать "ногой в дверь", записывая значение прямо в Name и потом ALTER TABLE его с переименованием и сменой типа, но я бы не рисковал ;)
Ответ написан
@kalapanga
Сначала создаёте новое поле. Следующим действием делаете Update таблицы TableA.
Про update читайте здесь: https://www.postgresql.org/docs/16/sql-update.html
Обратите внимание на вариант update from.
Результат не может быть полностью верным если в TableB поле Name неуникально, что по описанию таблицы возможно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы