Sql-如何搜索具有两个特定变量的不同行

Sql-如何搜索具有两个特定变量的不同行,sql,sql-server,Sql,Sql Server,我试图阅读教程,并为特定目的查找有关sql子查询语法的问题,但似乎找不到合适的词语来描述我的问题 表-零件说明 +------------+------------+------------+ | ID | Part # | Type | +------------+------------+------------+ | 1 | 123 | 1 | | 2 | 456 |

我试图阅读教程,并为特定目的查找有关sql子查询语法的问题,但似乎找不到合适的词语来描述我的问题

表-零件说明

+------------+------------+------------+
| ID         | Part #     |    Type    |
+------------+------------+------------+
| 1          |     123    |      1     |
| 2          |     456    |      2     |
| 3          |     123    |      3     |
| 4          |     789    |      4     |
| 5          |     123    |      4     |
| 6          |     789    |      2     |
| 7          |     123    |      2     |
+------------+------------+------------+
我基本上需要找到类型值同时为“2”和“4”的任何零件号,而不是一个或另一个

我觉得这应该是非常简单的,但我似乎无法得到正确的结果

这是可行的:

SELECT PartNumber, COUNT(*)
FROM Table
WHERE Type IN (2, 4)
GROUP BY PartNumber HAVING COUNT(*) > 1

您可以使用WHERE、GROUP BY和HAVING子句的组合来获得结果。HAVING子句中的关键是计算WHERE筛选器中包含的不同项:

select [part #]
from partDescriptions
where type in (2, 4)
group by [part #]
having count(distinct type) = 2;

如果只想返回仅包含类型2和类型4的零件,则可以展开此操作:

select PartNum
from yourtable
where type in (2, 4)
  and partnum not in (select partnum
                      from yourtable 
                      where type not in (2, 4))
group by PartNum
having count(distinct type) = 2

请参见

您希望零件号不缺少两个必需值。下面的查询看起来很复杂,但它比解决此类问题的一些更简单的解决方案更容易推广到类似的需求

如果有一个表列出了所有有效零件号,则可以在最外层的SELECT中使用该表,以避免需要SELECT DISTINCT

WITH RequiredParts(p) AS (
  SELECT 2 UNION ALL SELECT 4
)
  SELECT DISTINCT([Part #]) AS [Part #]
  FROM [Part Descriptions] AS PD
  WHERE NOT EXISTS (
    SELECT * FROM RequiredParts AS RP
    WHERE NOT EXISTS (
      SELECT * FROM [Part Descriptions] AS PD2
      WHERE PD2.[Part #] = PD.[Part #]
      AND PD2.[Type] = RP.p
    )
  )

这其中的一个问题是,如果他们对类型为2的零件有两个条目,等等,这将返回零件。是的,这就是为什么我给了你一个+1,以获得更准确的答案!感谢您的介绍,但不幸的是,示例表的类型值要少得多。有趣的方法!仅当类型为2或4的零件号正好为2时,此选项才有效。如果添加了另一部分,则查询不会将其包含在结果中@Tony我不确定我是否理解你的评论,从样本数据中它返回了123789部分。123有类型1、2、4,789有类型2、4。请随意详细说明。OP特别要求返回所有带有2,4类型的零件,因此如果您添加带有2类型的零件1234,他们不会想要它。实际上,我取消了我的否决票,因为我意识到我误解了问题,他想要类型为2和4的零件。因此,我的示例不需要包含在结果中。尽管如此,我现在不会取消否决票!除非答案经过编辑,哦,好吧,我相信你可以在bluefeet上节省2个代表点@Yosi-冷静下来,我认为答案不正确,但我已经重新阅读了问题。
WITH RequiredParts(p) AS (
  SELECT 2 UNION ALL SELECT 4
)
  SELECT DISTINCT([Part #]) AS [Part #]
  FROM [Part Descriptions] AS PD
  WHERE NOT EXISTS (
    SELECT * FROM RequiredParts AS RP
    WHERE NOT EXISTS (
      SELECT * FROM [Part Descriptions] AS PD2
      WHERE PD2.[Part #] = PD.[Part #]
      AND PD2.[Type] = RP.p
    )
  )