Как получить данные из таблицы ссылок, где все данные совпадают и только совпадают? - PullRequest
0 голосов
/ 04 июня 2019

Мне нужно получить только 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
...

Мне нужно вернуть product_price_id, где совпадает attribute_id.Должно быть возвращено только одно значение, или, если не найдено, возвращаемое значение NULL.

Если предложение where имеет только 004f92e8-34ca-4518-bfea-aef9abf07994 для attribute_id, мне нужно вернуть только 6fdcc85d-6fca-44c8-bb04-7b94bfc57294, а не 0e5bf36f-6e78-474f-a7f5-a77377ccb466

Если в предложении where есть 004f92e8-34ca-4518-bfea-aef9abf07994 и b2122096-a886-4bab-9a2b-8e237c59460a для attribute_id, мне нужно вернуть 0e5bf36f-6e78-474f-a7f5-a77377ccb466

Это может быть n количеством комбинаций, а не просто 1 или два, каждый раз пройденные.

Я пытался:

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;

Что, кажется, работает, если я передаю 2 значения в предложении where.

Но когда я передаю одно значение, я получаю 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 голосов
/ 04 июня 2019

Вот общий запрос, который должен работать здесь:

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 утверждает, что с продуктом не связан никакой UUID, кроме 3 в белом списке.Вторая часть утверждает, что на самом деле все три в белом списке появляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...