Sql 使用带有php参数的DB2Merge

Sql 使用带有php参数的DB2Merge,sql,merge,db2,Sql,Merge,Db2,我在一个脚本中使用PHP参数将一个工作插入到DB2中。它的工作原理和我想要的isnert一样,但我正在尝试修复它,这样我就不必每次都进行截断和重建。如果我的唯一键字段已经存在,我只想更新我的最后两个字段 插入: INSERT INTO testSchema.metrics (cust, item, material, color, group, group2, sales, score ) VALUES ( :cust_id, :item,

我在一个脚本中使用PHP参数将一个工作插入到DB2中。它的工作原理和我想要的isnert一样,但我正在尝试修复它,这样我就不必每次都进行截断和重建。如果我的唯一键字段已经存在,我只想更新我的最后两个字段

插入:

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和color上有一个唯一的键约束,所以我基本上是在DB2中进行一次UPSERT

我知道我可以在DB2中使用MERGE,我已经开始在这里介绍了,但我只是对如何充实这一点感到困惑,特别是因为我使用的是脚本中的参数

这是我的psuedo合并:

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
        );
我觉得这是基本的想法,但我不知道如何解决参数的使用和在线问题

我只是想说(如果一行在客户id、商品、材质和颜色上匹配,则使用新的销售和分数进行更新。否则,插入)

试试这个:

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);
根据这一点(在“使用值的单行合并”部分下),您只需要在
using
子句中的一个位置设置参数,然后将每个参数映射到别名S。然后定义
匹配的
不匹配的
逻辑

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);

是否将表格用作“选择”对话框中的占位符?或者你只是把它命名为表,因为它选择了那些参数,我不明白这个问题。我使用这种方法命名结果集中的列<代码>从表(值(1,1,1,1,1,1,1,1,1,1),(2,2,2,2,2,2))中选择*(客户id、项目、材料、颜色、组、组2、销售、分数)
您在s.cust\u id=t.cust\u id上执行了
,我可以在正确的情况下执行3或4个条件?可能。我认为它的处理过程与
子句上的任何
一样。谢谢,现在尝试一下,看看我是否可以得到它processedIt语句包含错误的值数。我想您必须为值中的每一列设置更新。它是否有效?若要将8个值绑定到准备好的语句,请检查PHP代码。我希望在你的
你使用
之间的条件。组也是一个组,不应用作列名。尝试用双引号转义。