繁体   English   中英

SQL - 获取列表中所有列在另一列中具有相同值的行

[英]SQL - Get rows where all columns are in a list that have the same value in another column

我有一个数据库如下:

drinks_id   ingredients_master_id
1           2
1           3
1           4
2           2
2           4
3           5

我正在寻找一个查询,我可以在其中给它一个如 2,4 的成分_master_id 的列表,它会返回所有恰好有 2,4 的drinks_id。

所以在这种情况下,如果我给它的 ingredients_master_id 2,4,5 它会返回drinks_id 2 和3。如果我给它5 它会返回drinks_id 3。

这是我到目前为止所拥有的,但它目前没有显示正确的信息。

SELECT DISTINCT drinks.id
FROM drinks
WHERE drinks.id NOT IN
(
    SELECT drinks.id
    FROM ingredients 
        JOIN drinks ON ingredients.drinks_id = drinks.id 
    WHERE ingredients.ingredients_master_id NOT IN
    (
        2,3,4,5,6
    )
);

我正在寻找一个查询,我可以在其中给它一个如 2,4 的成分_master_id 的列表,它会返回所有恰好有 2,4 的drinks_id。

您可以使用group by并具有:

select drinks_id
from t
group by drinks_id
having sum( ingredients_master_id in (2, 4) ) = 2;

“= 2”是列表的大小,因此您需要针对不同的列表进行调整。

这是使用COUNT的解决方案示例:

SELECT i.drinks_id
FROM ingredients i
LEFT JOIN ingredients s 
       ON s.drinks_id = i.drinks_id 
      AND s.ingredients_master_id = i.ingredients_master_id 
      AND s.ingredients_master_id IN (2, 4) 
GROUP BY i.drinks_id
HAVING COUNT(i.drinks_id) = COUNT(s.drinks_id)

db<>小提琴

您可能使用not exists达到预期的结果,如下所示:

Select t.* 
  From your_table t
 Where t.ingredients_master_id in (2,4,5)
   And not exists
       (Select 1 from your_table tt
         Where tt.drinks_id = t.drinks_id
           And tt.ingredients_master_id not in (2,4,5))

您可以使用如下:

select drink_id
from (
select drink_id,listagg(ingredients_master_id,',')  within group( order by ingredients_master_id) val from <Table> group by drink_id)
where case
when instr('**2,4,5**',val)> 0
Then 'Y'
else 'N'
end = 'Y';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM