0

我有一家吉他店,还有一个与之配套的网站。

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

所以,拿 Gibson 吉他来说,我有一张桌子products和一张桌子PriceList_gibson,看起来像这样(简化):

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


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

我有一个看起来像这样的网络方法:

<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表中
  • 如果 asku被错误地输入到products表中,匹配将失败。

所以,我想要做的是获取与正在更新的供应商价目表匹配但未出现在价目表中supplierId的项目列表。products

我当然可以通过循环记录来做到这一点,但是我将如何使用 1 条 sql 语句来做到这一点,或者更好的是,将其合并到上面?

4

1 回答 1

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)
于 2012-08-24T09:00:46.160 回答