我只需要获取与传递的所有ID匹配的product_price_id。
给出下表:
id attribute_id(uuid) product_price_id(uuid)
1 004f92e8-34ca-4518-bfea-aef9abf07994 6fdcc85d-6fca-44c8-bb04-7b94bfc57294
2 b2122096-a886-4bab-9a2b-8e237c59460a 0e5bf36f-6e78-474f-a7f5-a77377ccb466
3 004f92e8-34ca-4518-bfea-aef9abf07994 0e5bf36f-6e78-474f-a7f5-a77377ccb466
...
我需要带回attribute_id匹配的product_price_id。应该只返回一个值,或者如果找不到则返回null。
如果where子句的attribute_id仅具有004f92e8-34ca-4518-bfea-aef9abf07994
,则只需要带回6fdcc85d-6fca-44c8-bb04-7b94bfc57294
而不是0e5bf36f-6e78-474f-a7f5-a77377ccb466
如果我的where子句的attribute_id具有004f92e8-34ca-4518-bfea-aef9abf07994
和b2122096-a886-4bab-9a2b-8e237c59460a
,则需要带回0e5bf36f-6e78-474f-a7f5-a77377ccb466
这可以是n个连击,而每次不会只有1或2个通过。
我尝试过:
SELECT product_price_id
FROM product_override_pricing t
WHERE t.attribute_id IN ('004f92e8-34ca-4518-bfea-aef9abf07994', 'b2122096-a886-4bab-9a2b-8e237c59460a')
GROUP BY product_price_id
HAVING COUNT(1) = 2;
如果我在where子句中传递2个值,这似乎可行。
但是,当我传递一个值时,我会得到2个结果:
SELECT product_price_id
FROM product_override_pricing t
WHERE t.attribute_id IN ('004f92e8-34ca-4518-bfea-aef9abf07994')
GROUP BY product_price_id, attribute_id
HAVING COUNT(1) = 1;
我只是为了测试而尝试了类似的方法
SELECT * FROM product_override_pricing as s
WHERE NOT EXISTS (( SELECT '004f92e8-34ca-4518-bfea-aef9abf07994' UNION SELECT 'b2122096-a886-4bab-9a2b-8e237c59460a' )
EXCEPT
(SELECT sp.product_price_id FROM product_override_pricing sp WHERE sp.product_price_id = s.product_price_id ) );
但是,我收到以下错误:
EXCEPT types text and uuid cannot be matched
答案 0 :(得分:0)
这是应该在此处使用的常规查询:
SELECT product_price_id
FROM product_override_pricing
GROUP BY product_price_id
HAVING COUNT(CASE WHEN attribute_id <> '004f92e8-34ca-4518-bfea-aef9abf07994'
THEN 1 END) = 0;
这里的想法是通过product_price_id
进行汇总,然后断言只有004f92e8-34ca-4518-bfea-aef9abf07994
UUID attribute_id
与匹配产品相关联。
更一般的查询形式:
SELECT product_price_id
FROM product_override_pricing
GROUP BY product_price_id
HAVING
COUNT(CASE WHEN attribute_id NOT IN (uuid1, uuid2, uuid3) THEN 1 END) = 0 AND
COUNT(DISTINCT attribute_id) = 3;
HAVING
子句的第一部分断言,除了白名单中的3之外,没有其他UUID与该产品相关联。第二部分声称实际上白名单中的所有三个都出现了。