Выполнение 2 слияний DB2 на основе параметров php с использованием идентификатора - PullRequest
0 голосов
/ 23 января 2019

У меня есть успешный запрос на выборку, где я зацикливаюсь и строю строку для получения параметров, которая работает правильно

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    

Наверное, главный вопрос: как я могу получить идентификатор записи из таблицы продуктов (будь то существующее совпадение ИЛИ вновь созданное в слиянии) и как только я его получу, как я могу использовать его для второго сливаться?

...