从另一个表更新一个表并获取不匹配的行

时间:2012-08-24 08:53:13

标签: mysql sql database

我有一家吉他店,还有一个网站。

在许多其他持续性问题中,供应商的价格变化,所以我试图通过将每个价目表上传到我的数据库中的预先格式化的表格,然后通过sku相应地更新行来将产品同步到供应商价格表。

所以,拿吉布森吉他,我有一张表products和一张表PriceList_gibson看起来像这样(简化):

**Products:**
id    |    sku    |    description    |    cost     .... more fields


**PriceList_gibson**
id    |    sku    |    description    |    trade    .... more fields

我有一个Web方法,如下所示:

<System.Web.Services.WebMethod()> _
Public Shared Function syncPrices(supplierId, tableName)

    Try
        Common.changeData("UPDATE " & tableName & " p, products pp SET pp.rrp= p.rrp, pp.cost= p.trade,  pp.upc= CASE WHEN p.upc <> '' THEN  p.upc ELSE  pp.upc END WHERE pp.sku= p.sku AND pp.supplier ='" & supplierId & "'")
        Return "success|Prices Synced"
    Catch ex As Exception
        Return "error|" & ex.ToString
    End Try

End Function

关键部分是SQL语句,细分如下:

UPDATE " & tableName & " p, products pp 
     SET 
         pp.rrp= p.rrp,  
         pp.cost= p.trade, 
         pp.upc= CASE WHEN p.upc <> '' THEN  p.upc ELSE  pp.upc END 
     WHERE pp.sku= p.sku AND pp.supplier ='" & supplierId & "'

显然tableNamesupplierId是从调用此功能传入的变量,并确定我们正在处理的供应商价格,以及数据库中要查看的产品。

这很好,它与产品表中的sku字段匹配,与供应商价格表中的sku字段匹配,并相应地更新价格相关字段,以及UPC(如果可用)。

有两种情况未得到处理:

  • 如果停止使用该产品,则会从价目表中删除该项目时找不到sku匹配项,但可能会保留在products
  • 如果sku表中的products输入错误,则匹配将失败。

因此,我想要做的是获取supplierIdproducts字段与正在更新的供应商价格表的字段匹配的项目列表,但不会出现在价目表中。

我可以通过循环记录来做到这一点,但是如何用1 sql语句来做,或者甚至更好,将它包含在上面?

1 个答案:

答案 0 :(得分:0)

编辑:要获取product中存在但" & tableName & "中不存在的行...

SELECT
  *
FROM
  product                 pp
LEFT OUTER JOIN
  " & tableName & "       p
    ON p.sku= pp.sku
WHERE
  pp.supplier = '" & supplierId & "'
  AND p.sku IS NULL

或者...

SELECT
  *
FROM
  product
WHERE
  supplier = '" & supplierId & "'
  AND NOT EXISTS (SELECT * FROM " & tableName & " WHERE sku = product.sku)