SQL многие ко многим, как проверить критерии на нескольких строках - PullRequest
0 голосов
/ 21 мая 2018

В таблице «многие ко многим», как найти идентификатор, в котором сопоставлены все критерии, но, может быть, одна строка соответствует одному критерию, а другая строка соответствует другому критерию?

Например, допустим, у меня есть таблицакоторая сопоставляет корзины покупок с продуктами, и другую таблицу, в которой определены продукты.

Как найти корзину, в которой есть хотя бы одно совпадение по каждому критерию?

Критерии могут быть следующими:например, product.category like '%fruit%', product.category like '%vegetable%' и т. д.

В конечном итоге я хочу получить обратно shopping cart ID (может быть все из них, но в моем конкретном случае я рад получить любой соответствующий идентификатор)в котором есть хотя бы одно совпадение.

Ответы [ 4 ]

0 голосов
/ 22 мая 2018

Общий подход, который, возможно, не самый эффективный:

with data as (
    select *,
        count(case when <match condition> then 1 end)
            over (partition by cartid) as matches
    from <cart inner join products ...>
)
select * from data
where matches > 0;
0 голосов
/ 21 мая 2018

Вы можете использовать операторы ANY и ALL в сочетании с внешними объединениями.A простой образец в отношении M: N:

select p.name
  from products p
 where id_product = ALL    -- all operator 
 (  select pc.id_product
     from categories c 
     left outer join product_category pc on pc.id_product = p.id_product and
                                          pc.id_category = c.id_category
 )
0 голосов
/ 21 мая 2018

Я думаю, вы можете выяснить имена столбцов

select c.id 
from cart c
join product p 
  on c.pID = p.ID 
group by c.id 
having count(distinct p.catID) = (select count(distinct p.catID) from product)
0 голосов
/ 21 мая 2018

Я предполагаю таблицу с именем cart_per_product с полями cart, product, и таблицу с именем product с полями product, category.

select cart from cart_per_product c
where exists 
(
    select 1 from product p1 where p1.product=c.product and p1.category like N'%fruit%'
)
and exists 
(
    select 1 from product p2 where p2.product=c.product and p2.category like N'%vegetable%'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...