Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于同一键从另一个表复制字段的简单sql查询_Sql_Oracle - Fatal编程技术网

基于同一键从另一个表复制字段的简单sql查询

基于同一键从另一个表复制字段的简单sql查询,sql,oracle,Sql,Oracle,我正在寻找一个最简单的查询,它允许我实现将一些值从表A复制到表B,同时它们都有一个相同的键来标识所需的内容 我基本上有两个代表用户的表(仅用于示例目的) Table A contains USER_NAME, USER_ID, JOINED_DATE, RANK Table B contains USER_ID, ACCOUNT_DETAILS, ADDRESS, RANK 我对排名1有一个小错误,现在我看到在某些情况下排名只在B中更新,这意味着在a中它总是空的,但在某些情况下它在B中可用。

我正在寻找一个最简单的查询,它允许我实现将一些值从表A复制到表B,同时它们都有一个相同的键来标识所需的内容

我基本上有两个代表用户的表(仅用于示例目的)

Table A contains USER_NAME, USER_ID, JOINED_DATE, RANK
Table B contains USER_ID, ACCOUNT_DETAILS, ADDRESS, RANK
我对排名1有一个小错误,现在我看到在某些情况下排名只在B中更新,这意味着在a中它总是空的,但在某些情况下它在B中可用。 我想运行一个数据库更新,该更新将:

  • 检查过去30天通过表A创建的用户
  • 然后获取该用户ID并在表B上使用该键
  • 并勾选“如果表B中的ID具有等级
  • 将该排名复制到表A中的同一用户_ID”
  • 为了澄清-表A中的所有列组都是空的,这是一个错误,表B中的一些列组有数据,一些列组为空,这是设计的,可以。我想要的是两个列在某个时间段内保持相同,而不是从时间的开始

    如果查看下面的示例图像,您可以看到它已复制(基于其非空且加入日期大于2019的条件:

  • 123-自其有效性起已复制排名
  • 111-已复制列组,因为其有效
  • 121-未复制,因为排名为空且日期低于2020
  • 141-由于排名存在,但日期低于2020,因此未被处理
  • 我希望这是可以理解的,如果还有更多问题,请询问:)

    提前多谢善良的人们

    非常新,已经有一段时间没有接触SQL了。
    这是Oracle SQL,如果有关系的话。

    您可以使用以下简单更新:

    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);
    

    只需使用
    连接

    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年的日期,则日期比较会略有不同。

    请提供示例数据和所需结果。@GordonLinoff添加了一个具有预期结果的示例图像,告诉我您是否需要更多信息,还添加了关于该示例的更多详细信息您的问题有点混乱。30天还是2020年?真的不重要,我想在2020年以上跑完全程,并且在某个时候跑完30天,所以只要有日期检查我就可以玩,实际的数字对我来说并不重要