Простой sql-запрос для копирования полей из другой таблицы на основе того же ключа

#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.
Я хочу запустить обновление БД, которое будет:

  1. проверьте, какие ПОЛЬЗОВАТЕЛИ были созданы с помощью таблицы A, присоединенной за последние 30 дней,
  2. а затем возьмите этот USER_ID и используйте этот ключ в таблице B
  3. и проверьте, «имеет ли этот идентификатор в таблице B РАНГ,
  4. скопируйте этот РАНГ в тот же USER_ID в таблице A».

Чтобы уточнить — весь РАНГ в таблице A пуст, что является ошибкой, некоторый РАНГ в таблице B содержит данные, а некоторые — NULL, это так, как задумано, и все в порядке. я хочу, чтобы оба столбца РАНГА были, например, одинаковыми в течение некоторого периода времени, обычно не с начала времени.

Если вы посмотрите на пример изображения ниже, вы увидите, что он скопирован (при условии, что его значение не равно нулю, а дата соединения выше 2019:

  1. 123 — скопированный РАНГ с момента его действительного
  2. 111 — скопированный РАНГ с момента его действительного
  3. 121 — не был скопирован, поскольку РАНГ пуст, а дата ниже 2020
  4. 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 году.