#sql #oracle
#sql #Oracle
Вопрос:
Я ищу простейший запрос, который позволит мне выполнить копирование некоторого значения из таблицы A в таблицу B, пока они оба имеют один и тот же ключ, чтобы определить, что нужно.
У меня в основном есть (только для примера) 2 таблицы, которые представляют пользователей.
Table A contains USER_NAME, USER_ID, JOINED_DATE, RANK
Table B contains USER_ID, ACCOUNT_DETAILS, ADDRESS, RANK
У меня была небольшая ошибка с РАНГОМ один, и теперь я вижу, что в некоторых случаях РАНГ обновляется только в B, то есть в A его всегда NULL, но в некоторых случаях он доступен в B.
Я хочу запустить обновление БД, которое будет:
- проверьте, какие ПОЛЬЗОВАТЕЛИ были созданы с помощью таблицы A, присоединенной за последние 30 дней,
- а затем возьмите этот USER_ID и используйте этот ключ в таблице B
- и проверьте, «имеет ли этот идентификатор в таблице B РАНГ,
- скопируйте этот РАНГ в тот же USER_ID в таблице A».
Чтобы уточнить — весь РАНГ в таблице A пуст, что является ошибкой, некоторый РАНГ в таблице B содержит данные, а некоторые — NULL, это так, как задумано, и все в порядке. я хочу, чтобы оба столбца РАНГА были, например, одинаковыми в течение некоторого периода времени, обычно не с начала времени.
Если вы посмотрите на пример изображения ниже, вы увидите, что он скопирован (при условии, что его значение не равно нулю, а дата соединения выше 2019:
- 123 — скопированный РАНГ с момента его действительного
- 111 — скопированный РАНГ с момента его действительного
- 121 — не был скопирован, поскольку РАНГ пуст, а дата ниже 2020
- 141 — не удалось выполнить, поскольку РАНГ существует, но дата ниже 2020
Надеюсь, это понятно, пожалуйста, спросите, есть ли еще вопросы 🙂
Заранее большое спасибо, добрые люди!
довольно новый и давно не касался SQL. это Oracle SQL, если это имеет значение.
Комментарии:
1. Пожалуйста, предоставьте образцы данных и желаемые результаты.
2. @GordonLinoff добавил пример изображения с ожидаемыми результатами, скажите мне, нужна ли вам дополнительная информация, также добавил более подробную информацию об этом примере
3. Ваш вопрос немного сбивает с толку . , , 30 дней или в 2020 году?
4. на самом деле это не имеет значения, я хочу запустить все выше 2020 года и в какой-то момент запустить последние 30 дней, поэтому, пока есть проверка даты, я могу с ней поиграть, фактическое число для меня не имеет значения
Ответ №1:
Вы можете использовать простое обновление следующим образом:
Update tablea a
Set a.rank = (select b.rank
From tableb b where b.user_id = a.user_id)
Where exists (select 1 from
Tableb b where b.user_id = a.user_id
And b.rank is not null)
And a.rank is null;
--And a.joined_date >= add_months(trunc(sysdate), -1);
Ответ №2:
Просто используйте join
:
select a.*, b.rank
from a left join
b
on a.user_id = b.user_id and
a.joined_date >= sysdate - interval '30' day
Если вы хотите обновить ранг в:
update a
set rank = (select b.rank
from b
where a.user_id = b.user_id
)
where a.joined_date >= sysdate - interval '30' day;
Сравнение дат будет немного отличаться, если вам нужны только даты в 2020 году.