Использование слияния db2 с параметрами php - PullRequest
0 голосов
/ 04 октября 2018

У меня есть рабочая вставка, идущая в DB2 с использованием параметров PHP в скрипте.Это работает так, как я хочу для isnert, но я пытаюсь исправить это, чтобы мне не приходилось урезать и перестраивать каждый раз.Я хотел бы просто обновить свои последние 2 поля, если мои уникальные ключевые поля уже существуют.

Вставка:

INSERT INTO testSchema.metrics (cust, item, material, color, group, group2, sales, score )
    VALUES (
        :cust_id, 
        :item,
        :material,
        :color,
        :group,
        :group2,
        :sales,
        :score
    )

У меня есть ограничение уникального ключа для cust_id, item, material ицвет, поэтому я пытаюсь сделать UPSERT в основном, но в DB2.

Я знаю, что могу использовать MERGE в DB2, и я начал здесь, но я просто запутался в том, как конкретизировать этоиз-за того, что я использую параметры из скрипта.

вот мое слияние псевдо:

MERGE INTO testSchema.metrics as m
USING // I guess I would need all of my parameters here?
ON :cust_id, :item, :material, :color
WHEN MATCHED THEN
    UPDATE SET sales = :sales, score = :score
WHEN NOT MATCHED THEN
    INSERT (cust, item, material, color, group, group2, sales, score )
    VALUES (
            :cust_id, 
            :item,
            :material,
            :color,
            :group,
            :group2,
            :sales,
            :score
        );

Я чувствую, что это основная идея, но я запутался, как исправить USINGи ON строки для параметров.

Я просто пытаюсь сказать (если строка соответствует cust_id, номенклатуре, материалу и цвету, то обновиться с новыми продажами и оценками. Иначе, вставить)

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

В соответствии с этим учебным пособием IBM (в разделе "Однорядная запись MERGE using VALUES") вам нужно будет установить параметры только в одном месте в предложении USING, а затем сопоставить каждый из них с псевдонимом, S .Затем определите логику MATCHED и NOT MATCHED.

MERGE INTO testSchema.metrics AS T 
      USING (VALUES (
                     :cust_id, 
                     :item,
                     :material,
                     :color,
                     :group,
                     :group2,
                     :sales,
                     :score
                    )
             ) 
     AS S(CUST_ID, ITEM, MATERIAL, COLOR, "GROUP", GROUP2, SALES, SCORE)
     ON S.CUST_ID = T.CUST_ID
  WHEN MATCHED 
     THEN UPDATE SET SALES = S.SALES, SCORE = S.SCORE
  WHEN NOT MATCHED 
     THEN INSERT VALUES(S.CUST_ID, S.ITEM, S.MATERIAL, S.COLOR, 
                        S."GROUP", S.GROUP2, S.SALES, S.SCORE);
0 голосов
/ 04 октября 2018

Попробуйте это:

MERGE INTO testSchema.metrics as m
USING (
SELECT * FROM TABLE(VALUES 
(:cust_id, :item, :material, :color, :group, :group2, :sales, :score)
) t (cust_id, item, material, color, group, group2, sales, score)
) t on t.cust_id=m.cust_id and t.item=m.item
WHEN MATCHED THEN UPDATE 
SET sales = t.sales, score = t.score
WHEN NOT MATCHED THEN INSERT (cust_id, item, material, color, group, group2, sales, score)
VALUES (t.cust_id, t.item, t.material, t.color, t.group, t.group2, t.sales, t.score);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...