可以说,我有以下表:

  • 客户
  • 产品
  • CustomerProducts

有没有办法我可以做一个选择从该客户和产品的表格,其价值并不在地图表?基本上我需要一个匹配的客户名单和产品,他们没有自己。

另一种扭曲:我需要对每一个客户产品。那么如果5的客户没有产物,只有第一个客户在查询应该产品A.所以结果应该是这样的:

(假定所有客户自己的产品B,以及多于一个客户拥有的产品的A、C、和D)

  1. 客户的1,一个产品
  2. 客户2、产品C
  3. 顾客3、产品D

最终扭曲:我需要运行这种查询的一部分,更新声明中SQL服务器。所以我需要价值从第一行:

客户的1,一个产品

和更新客户记录之类的东西

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

但是,这将是好的,如果我可以这样做,整个过程中,在一个SQL发言。所以我查询一次,就更新1客户的产品,他们没有自己。希望这不太令人困惑你!在此先感谢!

有帮助吗?

解决方案

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

其他提示

如果你仅更新一个客户在一次,你可能需要记住它的产品已经自动分配(在CustomerProducts)或者有一个如何反常的产品已被分配自动(产品)

我试图这oracle(希望你的作品过)

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

如果客户不会自己多个产品?和你打算怎么维持这一领域的数据的变化?我以为你真的需要做一些更多的思考有关数据的结构,因为它没有意义的存储信息的客户表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top