在相关表中选择唯一的值,如果不是oracle

时间:2019-06-18 19:57:27

标签: sql oracle

我有一个PACKAGES表和一个ITEMS表。他们有一对多的关系。同样,每个商品都属于一个品牌,在下一个简化的数据库结构的基础上,id被引用。

PACKAGES
package_id

PACKAGE_ITEM
package_id
item_id

ITEMS
item_id
brand_id

BRANDS
brand_id
description

如何查询包装,并获得一个包含品牌(描述)的列(如果它对所有商品而言都是唯一的);如果没有的话就清空?

谢谢!

2 个答案:

答案 0 :(得分:0)

一种方法是使用case表达式进行聚合:

select pi.package_id,
       (case when min(i.brand_id) = max(i.brand_id)  -- all the same
             then min(i.brand_id)
        end) as package_brand_id
from package_item pi join
     items i
     on pi.item_id = i.item_id
group by pi.package_id;

如果需要说明,则可以加入brands

select pi.package_id,
       (case when min(b.description) = max(b.description)  -- all the same
             then min(b.description)
        end) as package_brand_id
from package_item pi join
     items i
     on pi.item_id = i.item_id join
     brands b
    on i.brand_id = b.brand_id
group by pi.package_id;

答案 1 :(得分:0)

加入表并按package_id分组。然后使用CASE语句确定所有商品中是否只有1个品牌:

select
  package_id,
  case 
    when count(distinct b.brand_id) = 1 then max(b.description) 
    else null
  end brand_description 
from packages p
inner join package_item pi on pi.package_id = p.package_id
inner join items i on i.item_id = pi.item_id
inner join brands b on b.brand_id = i.brand_id
group by p.package_id