如何根据某个依赖于where子句的优先级从另一个表更新一个表?

问题描述 投票:0回答:1

我有带有product_id,cost,year,quarter,...等列的表A。我还有另一个具有product_id,base_cost,current_year,p_year,p_quarter,p_order列的表B。

我想编写一个更新查询以从B更新A。我的条件是-

WHERE A.product_id=B.product_id
and A.year=B.current_year
and (A.year=B.p_year and A.quarter>B.p_quarter) or A.year>B.p_year
and A.cost=0;

但是问题是,在这些情况下,如果我在B行中有多于一行,那么我只想根据优先级从B行进行更新。

提供逻辑和示例以更好地理解-

基本上p_代表优先级。我想根据p_order从B更新A的成本。其次,我无法考虑当前和未来的季度更新。

用B更新A的唯一棘手条件是:(对于B行)1.如果A.year> B.p_year,则B的该行有资格更新2.if(A.year = B.p_year)然后A.quarter> B.p_quarter现在,根据上述2个条件,如果我们有多于1行的B要更新,则考虑具有最高p_order的B行。

示例1-

如果A有4行,如:

product_id  cost   year  quarter
102         0      2019  1
102         0      2019  2
102         0      2019  3
102         0      2019  4

和B有3行与where子句相对应:

MAPPING- B(年_季度,p_order)==> A(年,季度)映射显示A的所有行,B的该行有资格更新

product_id cost current_year p_year quarter p_order Mapping
102         3.5   2019         2019     3      1   A(2019,4)
102         1.8   2019         2019     1      2   A(2019,2),A(2019,3),A(2019,4)
102         0.5   2019         2019     2      3   A(2019,3),A(2019,4)

MAPPING- A(年,季度)==> B(p_年,季度,p_order)映射显示最适合的B行(具有最少的p_order)更新了A行。然后更新的A应该是:

product_id  cost   year  quarter Mapping
102         0      2019  1       none
102         1.8    2019  2       B(2019,1,2)
102         1.8    2019  3       B(2019,1,2)
102         3.5    2019  4       B(2019,3,1)

示例2-

如果A有4行,如:

product_id  cost   year  quarter
102         0      2019  1
102         0      2019  2
102         0      2019  3
102         0      2019  4

和B有3行与where子句相对应:

MAPPING- B(p_year,quarter,p_order)==> A(year,quarter)

product_id cost current_year p_year quarter p_order  Mapping
102        3.5   2019         2019     3      1   A(2019,4)
102        6.3   2019         2018     4      2   A(2019, all quarters)
102        0.5   2019         2019     2      3   A(2019,3),A(2019,4)

然后更新的A应该是:

MAPPING- A(年,季度)==> B(p_年,季度,p_order)

product_id  cost   year  quarter Mapping
102         6.3    2019  1       B(2018,4,2)
102         6.3    2019  2       B(2018,4,2)
102         6.3    2019  3       B(2018,4,2)
102         3.5    2019  4       B(2019,3,1)
postgresql join sql-update greatest-n-per-group
1个回答
0
投票

应将此作为注释进行处理。但是,出于某种程度的清晰度,我认为其他答案格式将被覆盖。您的描述与随附数据不匹配。在示例1中,您说表A有1行,然后继续显示4行,表B有2行,然后继续显示3行。还以示例2为例,详细描述您的映射是如何发生的(其中==>读为Maps to)

  • B(p_year,quarter,p_order)==> A(year,quarter)
  • B(2019,3,1)==> A(2019,4)
  • B(2018,4,2)==> A(2019,1)和A(2019,2)和A(2019,3)
  • B(2019,2,3)==>无
© www.soinside.com 2019 - 2024. All rights reserved.