0

私はギターショップとそれに付随するウェブサイトを持っています。

他の多くの継続的な問題の中には、サプライヤーの価格変更があります。そのため、各価格リストをデータベースの事前にフォーマットされたテーブルにアップロードし、それに応じて 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 & "'

明らかtableNameに とsupplierIdは、この関数の呼び出しから渡される変数であり、どのサプライヤーの価格を扱っているかを決定し、データベース内のどの製品を参照するかを決定します。

skuこれは正常に機能し、製品テーブルのskuフィールドをサプライヤーの価格表のフィールドに一致させ、それに応じて価格関連のフィールドを更新し、利用可能な場合は UPC も更新します。

処理されない 2 つのケースがあります。

  • 製品が廃止された場合、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 に答える