Если я вас правильно понимаю, вам просто нужно добавить два подзапроса в вашем операторе SELECT для поиска правильных идентификаторов. Например:
SELECT id,
(SELECT correct_id FROM User WHERE import_id=user_id) AS UserID,
(SELECT correct_id FROM Item WHERE import_id=item_id) AS ItemID,
created_at,
updated_at
FROM Downloads
Это преобразует ваши неверные user_ids в любой идентификатор, который вы хотите получить из таблицы User, и будет делать то же самое для ваших item_ids. Информация, поступающая из SQL, теперь будет правильной.
Если, однако, вы хотите обновить таблицы с правильной информацией, вы можете написать это так:
UPDATE Downloads
SET user_id = User.user_id,
item_id = Item.item_id
FROM Downloads
INNER JOIN User ON Downloads.user_id = User.import_id
INNER JOIN Item ON Downloads.item_id = Item.import_id
WHERE ...
Убедитесь, что что-то указано в предложении WHERE, чтобы не обновлять каждую запись в таблице загрузок (если это не план). Я переписал приведенный выше оператор, чтобы он был немного более оптимизированным, поскольку в исходной версии было два оператора SELECT на строку, что немного интенсивно.
Редактировать :
Поскольку это PostgreSQL, вы не можете иметь имя таблицы как в разделе UPDATE
, так и в разделе FROM
. Вместо этого таблицы в разделе FROM
объединяются с обновляемой таблицей. Вот цитата об этом с сайта PostgreSQL:
Когда присутствует предложение FROM, по существу происходит то, что целевая таблица объединяется с таблицами, упомянутыми в списке from, и каждая выходная строка объединения представляет операцию обновления для целевой таблицы. При использовании FROM вы должны убедиться, что соединение создает не более одной выходной строки для каждой строки, подлежащей изменению. Другими словами, целевая строка не должна соединяться с более чем одной строкой из других таблиц. Если это так, то только одна из строк соединения будет использоваться для обновления целевой строки, но какая из них будет использоваться, трудно предсказать.
http://www.postgresql.org/docs/8.1/static/sql-update.html
Имея это в виду, вот пример, который я думаю, должен работать (не могу проверить это, извините):
UPDATE Downloads
SET user_id = User.user_id,
item_id = Item.item_id
FROM User, Item
WHERE Downloads.user_id = User.import_id AND
Downloads.item_id = Item.import_id
Это основная идея. Не забывайте, что вам все равно потребуется добавить дополнительные критерии в раздел WHERE
, чтобы ограничить количество обновляемых строк.