Как обновить одну таблицу из другой таблицы, основываясь на некотором приоритете, который зависит от предложения where? - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть таблица A с столбцами product_id, cost, year, квартал, ... et c. У меня есть другая таблица B со столбцами product_id, base_cost, current_year, p_year, p_quarter, p_order.

Я хочу написать запрос на обновление для обновления A из B. Мои условия -

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 в соответствии с приоритетом.

Предоставление логики c и примеров для лучшего понимания -

в основном p_ обозначает приоритет. Я хочу обновить стоимость А от Б согласно p_order. Во-вторых, я не могу рассмотреть текущие и будущие кварталы для обновления.

Единственное сложное условие обновления A с помощью B: (для строки 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, равна рассмотрен.

Пример 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_year, квартал, 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)

Затем обновляется A должно быть:

MAPPING- A (год, квартал) ==> B (p_year, квартал, p_order)
Отображение показывает наиболее подходящую строку B (с наименьшим количеством p_order), которая обновила строку 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, квартал, p_order) ==> A (год, квартал)

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_year, квартал, 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)
...