有一个包含列category not nullsub_category default null的表.

  • category始终设置
  • sub_category是可选的

我需要从表中 Select distinct category,sub_category个,

  • 排除sub_category不为null且为null的记录
  • 如果只有category+<null>的一个组合,请保留记录
category    sub_category  
girl_toys        fluffy
girl_toys        dolls
drawing          <null> -- keep it since only one null sub_category
paining          red_color
paining          <null> -- exclude since there is non null sub_category

预期结果:

category    sub_category  
girl_toys        fluffy
girl_toys        dolls
drawing          <null> -- keep is since drawing has only one null
paining          red_color -- <null> record excluded since there is non null sub_category exists 

推荐答案

许多方法中的一种:

SELECT DISTINCT category, sub_category 
FROM   tbl t1
WHERE  sub_category IS NOT NULL
   OR  NOT EXISTS (
         SELECT FROM tbl t2
         WHERE  t2.category = t1.category
         AND    t2.sub_category IS NOT NULL
         );

如果相同的category+null有多个实例,我假设您也想保留一个副本.您真的只想排除category+null,前提是相同的category有另一行的sub_category不为空.至少这是你的"预期结果"所暗示的.

如果表很大,并且每(category, sub_category)个表中有许多重复项,则可以使用模拟的索引跳过扫描来优化性能.请参见:

Sql相关问答推荐

Postgresql:从jsons数组到单个id索引的json

当我们加入两个表时,我们可以省略GROUP BY中的列名吗?

有没有办法用SQL编写一条CASE语句,如果列A&>0,那么列B,列C=0

如何嵌套两条SQL语句

使用DatePart函数对日期时间值进行分组

根据Rails活动记录中时间戳/日期时间的时间部分从PostgreSQL中提取记录

在查询Oracle SQL中创建替代ID

不同计数的 Postgres PIVOT 表

对现有记录进行分组

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

我们可以使用连接改进包含多个子查询的查询吗

在presto sql中解析带有区域的时间格式

按公司和产品查询最近发票的平均价格的SQL查询

如何在插入时将字符串'03-January-2023'转换为日期时间

如何防止 SQL 中的负收入值并将其重新分配到接下来的月份?

snowfalke 会在 Select 运行时锁定表吗?

使用 json_agg 从 SQL 查询获取 [null] 响应

如何刷新在视图之上创建的表

SQL:有没有办法根据另一列的数据细节过滤和形成另一列?