3

次のテーブルがあるとしましょう。

  • お客様
  • 製品
  • CustomerProducts

値がマップテーブルにないCustomersテーブルとProductsテーブルから選択する方法はありますか?基本的に、私は顧客と彼らが所有していない製品の一致したリストが必要です。

もう1つの工夫:製品ごとに1人の顧客をペアリングする必要があります。したがって、5人の顧客が製品Aを持っていない場合、クエリの最初の顧客だけが製品Aを持っている必要があります。したがって、結果は次のようになります。

(すべての顧客が製品Bを所有し、複数の顧客が製品A、C、およびDを所有していると想定します)

  1. 顧客1、製品A
  2. 顧客2、製品C
  3. 顧客3、製品D

最後の工夫:SQLサーバーのUPDATEステートメントの一部としてこのクエリを実行する必要があります。したがって、最初の行から値を取得する必要があります。

顧客1、製品A

顧客レコードを次のようなものに更新します

UPDATE Customers
SET Customers.UnownedProduct = ProductA
WHERE Customers.CustomerID = Customer1ID

しかし、このプロセス全体を1つのSQLステートメントで実行できれば便利です。したがって、クエリを1回実行すると、1人の顧客が所有していない製品で更新されます。それがあなたにとってあまり混乱しないことを願っています!前もって感謝します!

4

4 に答える 4

3
WITH q AS
        (
        SELECT  c.*, p.id AS Unowned,
                ROW_NUMBER() OVER (PARTITION BY p.id ORDER BY c.id) AS rn
        FROM    Customers c
        CROSS JOIN
                Products p
        LEFT JOIN 
                CustomerProducts cp
        ON      cp.customer = c.id
                AND cp.product = p.id
        WHERE   cp.customer IS NULL
        )
UPDATE  q
SET     UnownedProduct = Unowned
WHERE   rn = 1

UPDATE statement will update the first customer who doesn't own a certain product.

If you want to select the list, you'll need:

SELECT  *
FROM    (
        SELECT  c.*, p.id AS Unowned,
                ROW_NUMBER() OVER (PARTITION BY p.id ORDER BY c.id) AS rn
        FROM    Customers c
        CROSS JOIN
                Products p
        LEFT JOIN 
                CustomerProducts cp
        ON      cp.customer = c.id
                AND cp.product = p.id
        WHERE   cp.customer IS NULL
    ) cpo
WHERE   rn = 1
于 2009-03-18T15:22:39.443 に答える
0

私はこれをオラクルで試しました(あなたにもうまくいくことを願っています)

UPDATE customers c
   SET unownedProduct =
       ( SELECT MIN( productid )
           FROM products
          WHERE productid NOT IN (
              SELECT unownedProduct
                FROM customers
               WHERE unownedProduct IS NOT NULL )
            AND productid NOT IN (
              SELECT productid
                FROM customerProducts cp
               WHERE cp.customerId = c.customerid )
       )
 WHERE customerId = 1
于 2009-03-18T16:25:35.127 に答える
0

顧客が複数の製品を所有していない場合はどうなりますか? また、データが変更されたときにこのフィールドをどのように維持しますか? この情報を顧客テーブルに格納する意味がないため、データ構造についてもう少し考える必要があると思います。

于 2009-03-18T17:29:12.070 に答える
0

If you update only one customer at once, you might need to remember which products have been assigned automatically (in CustomerProducts) or have a counter how often a product has been assigned automatically (in Products)

于 2009-03-18T15:23:00.533 に答える