SQL - 合并 in 和 not in

SQL - Combining in and not in

提问人:thanksforanyhelp7777 提问时间:11/3/2023 最后编辑:marc_sthanksforanyhelp7777 更新时间:11/3/2023 访问量:47

问:

我有一个 SQL,它向我展示了包含 3 个特定部件的产品。我想添加一个条件,查询包含 A、B、C 部分但不包含 D 部分的产品:

现有 QUERY:

SELECT Product
FROM your_table_name
WHERE Part IN ('a', 'b', 'c')
GROUP BY Product
HAVING COUNT(DISTINCT Part) = 3;

子查询?

感谢您的帮助!

SQL 子查询

评论

0赞 Tim Roberts 11/3/2023
如果 PART 在 ('a','b','c') 中,则 PART 不可能是 'D'。
0赞 thanksforanyhelp7777 11/3/2023
改写了问题 - 产品包含 a、b、c 部分,但不包含 d 部分
0赞 Adrian Maxwell 11/3/2023
是的,您可以自由添加(不要不必要地使用 IN)。但也要注意,如果那样你只能有 A & B 和 C,如果部分也是 D,那么将是 4and part <> 'D'count(distinct Part) = 3count(distinct Part)
0赞 Adrian Maxwell 11/3/2023
关于包含,这意味着您有一个部件层次结构 - 但问题细节中没有任何内容可以告知我们这是如何实现的。我们需要样本数据预期结果。数据应为“每个表”,并包含所有相关列。我建议您阅读以下内容:提供最小完整可验证示例 (MCVE)为什么我应该提供 MCVE
0赞 jarlh 11/3/2023
将“d”添加到您的 WHERE。并使用 HAVING 来确保没有“d”。所谓的条件聚合,即将表达式和聚合函数组合在一起。case

答:

0赞 JuSun Lee 11/3/2023 #1

其他方式。

AsIs:
SELECT Product
FROM your_table_name
WHERE Part IN ('a', 'b', 'c')
GROUP BY Product
HAVING COUNT(DISTINCT Part) = 3;
ToBe:
SELECT a.Product
FROM (
  SELECT a.Product
    , SUM(CASE WHEN a.Part = 'a' THEN 1 ELSE 0 END) AS A_YN
    , SUM(CASE WHEN a.Part = 'b' THEN 1 ELSE 0 END) AS B_YN
    , SUM(CASE WHEN a.Part = 'c' THEN 1 ELSE 0 END) AS C_YN
    , SUM(CASE WHEN a.Part = 'd' THEN 1 ELSE 0 END) AS D_YN
  FROM your_table_name a
  GROUP BY a.Product
) a
WHERE 1=1
AND (A_YN + B_YN + C_YN) = 3
AND D_YN = 0

评论

0赞 thanksforanyhelp7777 11/4/2023
嗨,JuSun,此查询未返回所有值。我不知道为什么。不过,我真的很感谢你的努力。谢谢!
0赞 SmellyCat 11/3/2023 #2

您可以将 NOT EXISTS 与相关的嵌套查询一起使用吗?

SELECT Product
FROM your_table_name
WHERE Part IN ('a', 'b', 'c') AND NOT EXISTS (
    SELECT * from your_table_name yt_inner
    WHERE yt_inner.Part = 'd' and
        yt_inner.Product = your_table_name.Product)
GROUP BY Product
HAVING COUNT(DISTINCT Part) = 3;