当前位置: 首页 > 面试题库 >

使用与两个或多个值匹配的JOIN进行SQL UPDATE

耿玄裳
2023-03-14
问题内容

我正在用JOIN执行SQL UPDATE,但是该JOIN可以匹配多个值。假设我们有以下表格:

    Table_1              Table_2
 col_a | col_b        col_a | col_b
---------------      ---------------
   1   |   A           1    |    X    
   2   |   B           1    |    Y   
   3   |   C           3    |    Z

然后执行以下查询:

UPDATE
  t1
SET
  t1.col_b = t2.col_b
FROM
  Table_1 t1
  JOIN
  Table_2 t2 ON t1.col_a = t2.col_a;

结果如下:

    Table_1              Table_2
 col_a | col_b        col_a | col_b
---------------      ---------------
   1   |   X           1    |    X    
   2   |   B           1    |    Y   
   3   |   Z           3    |    Z

我需要做的是Table_1使用最后匹配的值更新;因此,在这种情况下,我将需要以下结果:

    Table_1              Table_2
 col_a | col_b        col_a | col_b
---------------      ---------------
   1   |   Y           1    |    X    
   2   |   B           1    |    Y   
   3   |   Z           3    |    Z

问题答案:

如果您可以定义Table_2中记录的顺序(最后是什么意思?),则可以使用窗口函数来过滤Table_2,以仅包括与之匹配的每组记录的最后一条记录:

UPDATE
  t1
SET
  t1.col_b = t2.col_b
FROM
  Table_1 t1
  JOIN
  (SELECT col_a, col_b,
          ROW_NUMBER() OVER (PARTITION BY col_a 
                             ORDER BY <order by field list goes here> DESC) AS RNo
   FROM Table_2) t2 ON t1.col_a = t2.col_a AND t2.RNo=1;

在特殊情况下,order by字段是col_b,那么您可以简单地使用(这适用于所有版本的SQL Server):

UPDATE
  t1
SET
  t1.col_b = t2.col_b
FROM
  Table_1 t1
  JOIN
  (SELECT col_a, MAX(col_b) AS col_b
   FROM Table_2
   GROUP BY col_a) t2 ON t1.col_a = t2.col_a;


 类似资料:
  • 我的Cosmos DB中有以下json: 现在我尝试对 Technology.id 和评级应用过滤器。这意味着我想选择所有条目,例如评级为1的C#和评级为2的SQL。 大约 因为技术代表是一个不起作用的数组。 我也玩过,但我没有让它工作。 如何编写这样的查询?

  • 问题内容: 这将更好地显示在我的示例中: 我有一张桌子,存储着用户从一种大表格中得到的答案。每个表格有139个问题。这些问题存储在不同的表中,并在需要时与questionID结合在一起。对于每个用户,都有一个ID。现在,我需要进行过滤,以仅显示与特定问题匹配一个或 多个 答案的用户。 例如,我希望用户在问题14中回答为“是”,问题54不为空且问题100大于10的情况下。表的外观如下: 结果,我只希

  • 问题内容: 我有这样的桌子设计 并希望通过查询返回属于部门a和b的所有person_id。我认为这可能与 但不能完全弄清楚。有人知道我该怎么做吗? 编辑:我想我可以执行以下操作。但这似乎是一种hack。 问题答案: 注意:仅当一个人可以多次成为同一部门的成员时,才需要使用DISTINCT。

  • 问题内容: 在Pandas DataFrame中,我可以使用函数将列值与另一列进行匹配。 例如:假设我们有一个DataFrame: 和另一个DataFrame: 我可以使用的功能相匹配的列值对的列值 例如: 产量: PySpark DataFrame中的等效操作是什么? 上面的代码给我一条错误消息: 问题答案: 这种操作在spark中称为“左半联接”:

  • 问题内容: 我想做类似于“和”过滤器示例的操作,除了每个示例中都带有“应该”的术语,而不是示例中的字段类型。我提出以下内容: 但是,我收到此错误: 还有另一种方法可以执行我正在尝试执行的操作,还是我走在正确的轨道上?还是在Elasticsearch中这是不可能的? 问题答案: 每个布尔查询子句可以包含多个子句。字词查询(http://www.elasticsearch.org/guide/refe

  • 我有三张桌子: 表名:流派 表字段:id、名称 例1,行动 我试图有一个查询,得到所有的信息从动漫,也得到我的动漫的流派名称。 我有以下疑问: 这让我得到了动漫信息和所有流派的主要ID,但我没有他们的名字。 我一直在研究,但也许我做得不对。 顺便说一句,“动漫”是一个电视节目,所以它可以有多种流派,一对多的关系。