对不起,神秘的冠军,但我没有找到一个更好的问题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查询,但我不能找到一个解决办法...
对不起,神秘的冠军,但我没有找到一个更好的问题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查询,但我不能找到一个解决办法...
要获得它存在一排型= 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
)
易于维护且比Frank Schmitt的答案更快 – VSDekar 2014-09-23 11:45:17
你的意思是你想要的所有行类型不是3?
这将是本声明:
SELECT
*
FROM
`Article`
WHERE
`type` != 3;
重新阅读您的问题后,我明白你的问题。我会选择Eriks解决方案。
您可以通过汇总原始数据选择第一个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
关键字,而不是子查询。
另一种变型,使用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
您正在使用哪些DBMS? Postgres的?甲骨文? – 2014-09-23 10:25:41
Microsoft SQL Server – VSDekar 2014-09-23 11:00:51