如何从所有数据完全匹配且唯一匹配的链接表中获取数据?

时间:2019-06-04 05:38:37

标签: mysql sql postgresql

我只需要获取与传递的所有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-aef9abf07994b2122096-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

1 个答案:

答案 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;

Demo

这里的想法是通过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与该产品相关联。第二部分声称实际上白名单中的所有三个都出现了。