假设我有一个表将父对象与多个子对象链接,并且具有子对象的某些属性的列。以下面的简化示例为例:
product_id sku_id size_desc color_column_that_doesnt_matter
123 456 (null) black
123 457 (null) red
123 458 (null) grey
124 567 large green
124 568 medium green
124 569 small green
125 678 (null) blue
125 679 5x5 yellow
请注意,产品123和124的产品都具有尺寸描述的null或尺寸描述的值。 产品125虽然不同 - 它至少有一个具有null size_desc的sku和至少一个具有size_desc非空值的sku。
假设有很多产品,比如产品125 - 我想要它们。如何通过select ... where语句过滤此数据,以返回所有产品和所有具有size_desc的null和非null值混合的skus?
SQL风格是Oracle 11
答案 0 :(得分:1)
你可以得到这样的产品:
select product_id
from table t
group by product_id
having count(*) <> count(size_desc) and count(size_desc) > 0;
您可以通过将其切换为分析函数来获取所有这些产品的详细信息:
select t.*
from (select t.*, count(*) over (partition by product) as cnt,
count(size_desc) over (partition by product) as cnt_sizedesc
from t
) t
where cnt <> cnt_sizedesc and cnt_sizedesc > 0;