У меня есть успешный запрос на выборку, где я зацикливаюсь и строю строку для получения параметров, которая работает правильно
while ($row = $orderDetailCheck->fetch(PDO::FETCH_ASSOC)) {
$params = [
":INVOICE_NUMBER" => $row["INVOICE_NUMBER"],
":CUSTNM" => $row["CUSTNM"],
":SELLINGN" => $row["SELLINGN"],
":GROUP" => $row["GROUP"],
":DTL12" => $row["DTL12"],
":DTL13" => $row["DTL13"],
":QUANTITY" => $row["QUANTITY"],
":COUNT_PLMN_1" => $row["COUNT_PLMN_1"],
":LAST_DATE" => $row["LAST_DATE"],
];
}
Моя проблема заключается в том, что для каждой строки мне нужно выполнить два слияния, потому что данные из этого выбора будут разделены на две таблицы в db2. Некоторые значения действительно разделены между таблицами, но некоторые значения разделены между ними. Я не уверен, что лучший способ выполнить эти два слияния, потому что, если первое (таблица продуктов) вставляет, то оно создает идентификатор, который мне нужен как внешний ключ, чтобы вставить в таблицу заказов. Поэтому при вставке мне нужно захватить этот вновь созданный идентификатор и использовать его для product_id
во втором слиянии. Если первое слияние выполняет обновление при совпадении, то мне нужно получить существующий идентификатор для этой записи, чтобы я мог обновить соответствующую запись в таблице заказов.
Мои два оператора слияния:
/*products table*/
MERGE INTO products AS P
USING(VALUES(
:GROUP,
:DTL12,
:DTL13,
:CUSTNM,
:SELLINGN,
:COUNT_PLMN_1,
:LAST_DATE
)
)
AS S(GROUP,DTL12,DTL13,CUSTNM,SELLINGN,COUNT_PLMN_1,LAST_DATE)
ON s.GROUP = p.GROUP and s.DTL12 = p.DTL12 and s.DTL13 = p.DTL13 and s.CUSTNM = p.CUSTNM
WHEN MATCHED
THEN UPDATE SET LAST_DATE = s.LAST_DATE
WHEN NOT MATCHED
THEN INSERT VALUES (s.GROUP,s.DTL12,s.DTL13,s.CUSTNM,s.SELLINGN,s.COUNT_PLMN_1,s.LAST_DATE)
/*ORDERS Table*/
MERGE INTO ORDERS AS PO
USING(VALUES(
/*need foreign key, which is id from products table*/
:QUANTITY,
:LAST_DATE,
:INVOICE_NUMBER
))
AS S(PRODUCT_ID,quantity_ordered,LAST_DATE,invoice_number)
ON s.PRODUCT_ID = po.id
WHEN MATCHED
THEN UPDATE SET LAST_DATE = s.LAST_DATE, quantity_ordered = s.quantity_ordered, invoice_number = s.invoice_number
WHEN NOT MATCHED
THEN INSERT VALUES (s.PRODUCT_ID, s.quantity_ordered, s.LAST_DATE, s.invoice_number)
Примеры:
Если моя строка возвращается
INVOICE | CUSTNM | SELLINGNUM | GROUP | DTL12 | DTL13 | QUANTITY | COUNT_PLMN_1 | LAST_DATE
==================================================================================================================
1122 123 321 995 1452 12 13 5 '2018-12-14'
Тогда моя вставка в товары будет
products
ID | GROUP | DTL12 | DTL13 | CUSTNM | SELLINGNUM | COUNT_PLMN_1 | LAST_DATE
==========================================================================================================
1 995 1452 12 123 321 5 '2018-12-14'
и мой вкладыш для заказов:
ORDERS
PRODUCT_ID | QUANTITY_ORDERED | LAST_DATE | INVOICE
============================================================
1 13 '2018-12-14' 1122
Но если моя следующая запись соответствовала моим уникальным качествам с новым счетом, количеством и датой
ROW Returns
INVOICE | CUSTNM | SELLINGNUM | GROUP | DTL12 | DTL13 | QUANTITY | COUNT_PLMN_1 | LAST_DATE
==================================================================================================================
1133 123 321 995 1452 12 4 5 '2018-12-18'
Тогда я бы обновил продукты так:
products
ID | GROUP | DTL12 | DTL13 | CUSTNM | SELLINGNUM | COUNT_PLMN_1 | LAST_DATE
==========================================================================================================
1 995 1452 12 123 321 5 '2018-12-18'
и обновлять заказы так:
ORDERS
PRODUCT_ID | QUANTITY_ORDERED | LAST_DATE | INVOICE
============================================================
1 4 '2018-12-18' 1133
Наверное, главный вопрос: как я могу получить идентификатор записи из таблицы продуктов (будь то существующее совпадение ИЛИ вновь созданное в слиянии) и как только я его получу, как я могу использовать его для второго сливаться?