SQL - 从一列中选择唯一值,然后根据另一列进行过滤

时间:2015-02-04 14:42:14

标签: sql

我已经进行过搜索,并且已经看到了很多关于选择不同值的问题,但是它们中没有一个看起来足够接近我的查询以便能够提供帮助。这是方案

ID   Product_ID   Product_type
123  56789        A
123  78901        B
456  12345        A
789  45612        B

我需要的SQL是在类似于上面的表中搜索,并返回Product_typeB的行,但仅当与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 

并且都没有工作

3 个答案:

答案 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;