如何选择价值来自两个表格不包含在地图表?
-
20-08-2019 - |
题
可以说,我有以下表:
- 客户
- 产品
- CustomerProducts
有没有办法我可以做一个选择从该客户和产品的表格,其价值并不在地图表?基本上我需要一个匹配的客户名单和产品,他们没有自己。
另一种扭曲:我需要对每一个客户产品。那么如果5的客户没有产物,只有第一个客户在查询应该产品A.所以结果应该是这样的:
(假定所有客户自己的产品B,以及多于一个客户拥有的产品的A、C、和D)
- 客户的1,一个产品
- 客户2、产品C
- 顾客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
如果客户不会自己多个产品?和你打算怎么维持这一领域的数据的变化?我以为你真的需要做一些更多的思考有关数据的结构,因为它没有意义的存储信息的客户表。
不隶属于 StackOverflow