SQL多对多,如何检查多行

时间:2018-05-21 16:29:20

标签: sql sql-server tsql sql-server-2008-r2

在多对多表中,如何查找所有条件匹配的ID,但是一行符合一个标准而另一行符合另一个标准?

例如,假设我有一个将购物车映射到产品的表格,以及另一个定义产品的表格。

如何找到每个标准至少有一个匹配的购物车?

标准可以是,例如product.category like '%fruit%'product.category like '%vegetable%'

最终我希望得到一个shopping cart ID(可能是所有这些,但在我的具体情况下,我很乐意获得任何匹配的ID),其中至少有一个匹配。

4 个答案:

答案 0 :(得分:0)

我假设一个名为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%'
)

答案 1 :(得分:0)

您可以将ANYALL运算符与外连接结合使用。 M:N关系中的simple sample

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
 )

答案 2 :(得分:0)

我认为你可以找出列名

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)

答案 3 :(得分:0)

可能不是最有效的通用方法:

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;