我已经进行过搜索,并且已经看到了很多关于选择不同值的问题,但是它们中没有一个看起来足够接近我的查询以便能够提供帮助。这是方案
ID Product_ID Product_type
123 56789 A
123 78901 B
456 12345 A
789 45612 B
我需要的SQL是在类似于上面的表中搜索,并返回Product_type
为B
的行,但仅当与ID
相关的行存在时一次在桌子内。
所以在这种情况下它只会带回来
789 45612 B
我根据迄今为止发现的内容尝试的SQL是
SELECT DISTINCT(ID)
FROM "TABLE"
WHERE "PRODUCT_TYPE" = 'B'
以及
SELECT *
FROM "TABLE"
WHERE "PRODUCT_TYPE" = 'B'
GROUP BY "ID"
HAVING COUNT(ID) = 1
并且都没有工作
答案 0 :(得分:2)
通过出现一次的ID列表的一种方式:
select * from T where Product_type = 'B' and id in (
select id from T
group by id
having count(id) = 1)
答案 1 :(得分:0)
Soltuion 1:使用子查询计算id' s。
select * from table t1
where Product_type = 'B'
and (select count(*) from table
where id = t1.id) = 1
答案 2 :(得分:0)
您可以使用group by
进行此类查询。但是,您无法在聚合之前过滤到'B'
s 。
所以,试试这个:
SELECT t.id, MAX(t.product_id) as product_id,
MAX(t.product_type) as product_type
FROM "TABLE" t
GROUP BY "ID"
HAVING COUNT(*) = 1 AND
MAX(PRODUCT_TYPE) = 'B';
这可能看起来有点神秘。但having
子句保证只有一行,该行有'B'
。因此MAX()
函数从该行返回最大值 - 这是该行的值。
编辑:
许多数据库还允许您利用窗口函数:
select t.*
from (select t.*, count(*) over (partition by id) as id_cnt
from table t
) t
where t.product_type = 'B' and id_cnt = 1;