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