对于这个神秘的标题感到抱歉,但我没有找到更好的问题
我有一个表,让我们说这些数据:
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查询,但我无法找到解决方案...
答案 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解决方案。