2014-09-23 83 views
-1

对不起,神秘的冠军,但我没有找到一个更好的问题SQL查询,其中一个特定的列应该有两个特定的值,但只有一个

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

Table Article 

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

我正在寻找3.行,其中没有类型3的文章存在,但类型1的文章存在。

我认为这必须是一个非常简单的SQL查询,但我不能找到一个解决办法...

+0

您正在使用哪些DBMS? Postgres的?甲骨文? – 2014-09-23 10:25:41

+0

Microsoft SQL Server – VSDekar 2014-09-23 11:00:51

回答

0

要获得它存在一排型= 1所有ArticleNumbers但与类型= 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 
) 
+0

易于维护且比Frank Schmitt的答案更快 – VSDekar 2014-09-23 11:45:17

-1

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

这将是本声明:

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

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

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关键字,而不是子查询。

0

另一种变型,使用MINUS与3类型中移除相关文章:

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

UPDATE

重新阅读您的问题后,我想你也想拥有那些类型= 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 
相关问题