你如何正确构建IF EXIST UPDATE ELSE INSERT?

时间:2017-01-06 20:15:59

标签: mysql insert-update on-duplicate-key

我有一张表格,其中包含客户所花费的金额以及他们赚取的积分。我有一个主表,我打算积累积分/美元并将它们重新分配到商店,以便在所有商店共享积分。用于确定主表(CMCustomer)和商店表(cm01,cm03等等)之间差异的查询如下所示,每个商店都有一个单独的查询。

use customer;
truncate cm01process;
INSERT INTO cm01process
select cm01.CustomerNumber,
cm01.LastName,
cm01.FirstName,
cm01.Address,
cm01.City,
cm01.State,
cm01.ZIPCode,
cm01.PhoneNo,
cm01.DriverLicenseNo,
cm01.SocialSecNo,
cm01.TaxExempt,
cm01.ExternalRefNumber,
cm01.AuxField,
cm01.Comments,
cm01.FSLevelNo,
cm01.FSDateOpened,
cm01.FSLastVisit,
IFNULL(IF( (cm01.FSVisitsToDate - CMCustomer.FSVisitsToDate) < 0,  0, (cm01.FSVisitsToDate - CMCustomer.FSVisitsToDate) ), 0 ) AS FSVisitsToDate,
IFNULL(IF( (cm01.FSVisitsThisPeriod - CMCustomer.FSVisitsThisPeriod) < 0,  0, (cm01.FSVisitsThisPeriod - CMCustomer.FSVisitsThisPeriod) ), 0 ) AS FSVisitsThisPeriod,
IFNULL(IF( (cm01.FSPurchaseToDate - CMCustomer.FSPurchaseToDate) < 0,  0, (cm01.FSPurchaseToDate - CMCustomer.FSPurchaseToDate) ), 0 ) AS FSPurchaseToDate,
IFNULL(IF( (cm01.FSPurchaseThisPeriod - CMCustomer.FSPurchaseThisPeriod) < 0,  0, (cm01.FSPurchaseThisPeriod - CMCustomer.FSPurchaseThisPeriod) ), 0 ) AS FSPurchaseThisPeriod,
IFNULL(IF( (cm01.FSDiscountToDate - CMCustomer.FSDiscountToDate) < 0,  0, (cm01.FSDiscountToDate - CMCustomer.FSDiscountToDate) ), 0 ) AS FSDiscountToDate,
IFNULL(IF( (cm01.FSDiscountThisPeriod - CMCustomer.FSDiscountThisPeriod) < 0,  0, (cm01.FSDiscountThisPeriod - CMCustomer.FSDiscountThisPeriod) ), 0 ) AS FSDiscountThisPeriod,
IFNULL(IF( (cm01.FSPointsToDate - CMCustomer.FSPointsToDate) < 0,  0, (cm01.FSPointsToDate - CMCustomer.FSPointsToDate) ), 0 ) AS FSPointsToDate,
IFNULL(IF( (cm01.FSPointsThisPeriod - CMCustomer.FSPointsThisPeriod) < 0,  0, (cm01.FSPointsThisPeriod - CMCustomer.FSPointsThisPeriod) ), 0 ) AS FSPointsThisPeriod,
IFNULL(IF( (cm01.FSPromoPointsToDate - CMCustomer.FSPromoPointsToDate) < 0,  0, (cm01.FSPromoPointsToDate - CMCustomer.FSPromoPointsToDate) ), 0 ) AS FSPromoPointsToDate,
IFNULL(IF( (cm01.FSPromoPointsThisPeriod - CMCustomer.FSPromoPointsThisPeriod) < 0,  0, (cm01.FSPromoPointsThisPeriod - CMCustomer.FSPromoPointsThisPeriod) ), 0 ) AS FSPromoPointsThisPeriod,
cm01.LastUpdated
from cm01
left join CMCustomer on cm01.CustomerNumber = CMCustomer.CustomerNumber;

此查询正常。下一个查询是我开始遇到问题的地方。

-EDIT-

我更新了第二个查询。它不会产生错误,似乎主要是我想要的,但它没有正确添加。在下面的查询中,它应该在新表(processData)中插入选择中的字段。在重复上,它应该更新指定的字段,并在新行上添加它们。它似乎工作正常,除非执行UPDATE,它返回这些列中的所有零。示例:CMCustomer有55个点,cm01process有0个点。而不是将两个点加在一起并给我55它返回0.任何想法我在这里错了吗?

use customer;
INSERT INTO processData (CustomerNumber,
    LastName,
    FirstName,
    Address,
    City,
    State,
    ZIPCode,
    PhoneNo,
    DriverLicenseNo,
    SocialSecNo,
    TaxExempt,
    ExternalRefNumber,
    AuxField,
    Comments,
    FSLevelNo,
    FSDateOpened,
    FSLastVisit,
    FSVisitsToDate,
    FSVisitsThisPeriod,
    FSPurchaseToDate,
    FSPurchaseThisPeriod,
    FSDiscountToDate,
    FSDiscountThisPeriod,
    FSPointsToDate,
    FSPointsThisPeriod,
    FSPromoPointsToDate,
    FSPromoPointsThisPeriod,
    LastUpdated)
SELECT cm01process.CustomerNumber,
    cm01process.LastName,
    cm01process.FirstName,
    cm01process.Address,
    cm01process.City,
    cm01process.State,
    cm01process.ZIPCode,
    cm01process.PhoneNo,
    cm01process.DriverLicenseNo,
    cm01process.SocialSecNo,
    cm01process.TaxExempt,
    cm01process.ExternalRefNumber,
    cm01process.AuxField,
    cm01process.Comments,
    cm01process.FSLevelNo,
    cm01process.FSDateOpened,
    cm01process.FSLastVisit,
    cm01process.FSVisitsToDate,
    cm01process.FSVisitsThisPeriod,
    cm01process.FSPurchaseToDate,
    cm01process.FSPurchaseThisPeriod,
    cm01process.FSDiscountToDate,
    cm01process.FSDiscountThisPeriod,
    cm01process.FSPointsToDate,
    cm01process.FSPointsThisPeriod,
    cm01process.FSPromoPointsToDate,
    cm01process.FSPromoPointsThisPeriod,
    cm01process.LastUpdated
FROM cm01process
LEFT JOIN CMCustomer ON cm01process.CustomerNumber = CMCustomer.CustomerNumber
ON DUPLICATE KEY UPDATE     
        processData.FSVisitsToDate = CMCustomer.FSVisitsToDate + cm01process.FSVisitsToDate,
        processData.FSVisitsThisPeriod = CMCustomer.FSVisitsThisPeriod + cm01process.FSVisitsThisPeriod,
        processData.FSPurchaseToDate = CMCustomer.FSPurchaseToDate + cm01process.FSPurchaseToDate,
        processData.FSPurchaseThisPeriod = CMCustomer.FSPurchaseThisPeriod + cm01process.FSPurchaseThisPeriod,
        processData.FSDiscountToDate = CMCustomer.FSDiscountToDate + cm01process.FSDiscountToDate,
        processData.FSDiscountThisPeriod = CMCustomer.FSDiscountThisPeriod + cm01process.FSDiscountThisPeriod,
        processData.FSPointsToDate = CMCustomer.FSPointsToDate + cm01process.FSPointsToDate,
        processData.FSPointsThisPeriod = CMCustomer.FSPointsThisPeriod + cm01process.FSPointsThisPeriod,
        processData.FSPromoPointsToDate = CMCustomer.FSPromoPointsToDate + cm01process.FSPromoPointsToDate,
        processData.FSPromoPointsThisPeriod = CMCustomer.FSPromoPointsThisPeriod + cm01process.FSPromoPointsThisPeriod

0 个答案:

没有答案
相关问题