SQL查询,其中特定列应具有两个特定值但只有一个

时间:2014-09-23 09:57:09

标签: sql sql-server

对于这个神秘的标题感到抱歉,但我没有找到更好的问题

我有一个表,让我们说这些数据:

Table Article

ID    ArticleNumber    Type
1     10               1
2     10               3
3     20               1
4     30               1
5     30               3

我正在寻找没有类型3文章但存在类型1文章的3. Row。

我认为它必须是一个非常简单的SQL查询,但我无法找到解决方案...

4 个答案:

答案 0 :(得分:0)

要获取所有存在type = 1的行的ArticleNumbers,但没有type = 3的行,请使用:

SELECT
  *
FROM
  Article a
WHERE
  a.`Type` = 1
  AND NOT EXISTS (
    SELECT * FROM
      Article a2
    WHERE
      a2.`Type` = 3
      AND a2.ArticleNumber = a.ArticleNumber
  )

答案 1 :(得分:0)

您可以通过聚合原始数据来选择第一个ID(请参阅子查询),然后您可以过滤那些可能出现任何异常的记录。

如果需要,您可以将聚合更改为COUNT,然后您可以比较每种类型的计数。

SELECT
  ArticleNumber
FROM (
  -- Conditional aggregation to find the first ID for each type per ArticleNumber
  SELECT
      ArticleNumber
    , MIN(CASE WHEN Type = 1 THEN ID ELSE NULL END) AS Type_1
    , MIN(CASE WHEN Type = 3 THEN ID ELSE NULL END) AS Type_3
  GROUP BY
    ArticleNumber
) AS X
WHERE
  Type_1 IS NULL
  OR Type_2 IS NULL

注意如果需要,您可以更改上述查询以使用HAVING关键字而不是子查询。

答案 2 :(得分:0)

另一种变体,使用MINUS删除类型为3的文章:

select ID, ArticleNumber from Article where type = 1
MINUS
select ID, ArticleNumber from Article where type = 3

更新

重新阅读你的问题之后,我想你也想要那些Type = 3,但是没有Type = 1的行存在。为此,您可以使用COUNT DISTINCT

select * from (
  select ID, ArticleNumber, count(distinct type) as type_cnt
  from Article
  group by ID, ArticleNumber
) 
where type_cnt < 2

答案 3 :(得分:-1)

你的意思是你想要所有类型不是3的行?

这就是这句话:

SELECT 
  * 
FROM 
    `Article` 
WHERE 
    `type` != 3;

重新阅读您的问题后,我理解您的问题。我会选择Eriks解决方案。