2009-03-18 6 views
3

は、私は、次の表考えてみましょう:マップテーブルに含まれていない2つのテーブルから値を選択する方法はありますか?

  • お客様
  • 製品
  • CustomerProducts

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

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

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

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

最終ツイスト:私はこのクエリを実行する必要がありますとしてSQL SeverのUPDATEステートメントの一部。だから私は、最初の行から値を取る必要があります。

顧客1、製品

をして

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

ような何かに顧客レコードを更新しかし、私はこれを行うことができれば、それはいいだろう1つのSQL文でプロセス全体を処理します。だから私は一度クエリを実行し、彼らは彼らが所有していない製品で1顧客を更新します。 それはあまりにもあなたのために混乱しないことを望む!前もって感謝します!

+0

2人の顧客と1つのprdouct、どちらも所有していない場合はどうなりますか? –

+0

その後、最初の顧客とのクエリで1レコードのみが返されます。 –

答えて

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文では、特定の製品を所有していない最初顧客を更新します。

リストを選択したい場合は、あなたが必要です:

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 
+0

これはOPの別のそして最終的なひねりを考慮に入れない? –

+0

これは両方とも考慮に入れます:) – Quassnoi

+0

+1。私は追いつく必要があります。 –

0

一度に一つだけの顧客を更新した場合、あなたは(CustomerProductsに)自動的に割り当てられている製品を覚えておく必要があるか、必要がある場合があります製品は(製品に)自動的に割り当てられているどのくらいの頻度カウンタ

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 
0

何Cuが場合は、Oracleでこれを試してみましたstomerは複数の製品を所有していませんか?データが変更されると、このフィールドをどのように維持するのでしょうか?この情報を顧客テーブルに保存するのは理にかなっていないので、実際にデータ構造を考え直す必要があると思います。

関連する問題