我有如下表格结构
Package
PACK_ID | DESCR | BRAND_ID
1 | Shoes | 20
2 | Cloths| NULL
ITEMS
ITEM_ID | PACK_ID | BRAND_ID
100 | 1 | 10
101 | 1 | NULL
102 | 1 | 10
BRANDS
NAME | BRAND_ID
A | 10
B | 20
我想写一个查询来列出按相同品牌分组的包中有多少商品。如果品牌没有在商品中定义,它应该从包装中获得。 注意:包和项目中的Brand_id都可以为空
我的查询是
SELECT count (*) as count,p.descr as descr,b.name FROM [items] item
inner join [package] p on item.pack_id= p.pack_id
inner join [brands] b on b.brand_id = item.brand_id or b.brand_id = p.brand_id
where p.pack_id = 1
group by b.name,p.descr
我的结果是
COUNT | descr | NAME
2 | Shoes | a
3 | Shoes | B
而我希望结果是这样的
COUNT | descr | NAME
2 | Shoes | a
1 | Shoes | B
你可以告诉我的代码有什么问题吗?提前谢谢。
答案 0 :(得分:1)
尝试在连接条件下使用ISNULL:
SELECT count (*) as count,p.pack_id as pack_id,b.name FROM [items] item
inner join [package] p on item.pack_id= p.pack_id
inner join [brands] b on b.brand_id = ISNULL(item.brand_id, p.brand_id)
where p.pack_id = 1
group by b.name,p.pack_id
你的OR导致它加入多行,默认情况下应该使用该项,然后再回到包中。
答案 1 :(得分:1)
我倾向于通过获得项目和包的品牌来实现这一目标。然后决定在select
中使用哪一个:
SELECT count(*) as count, p.descr as descr, coalesce(bi.name, bp.name) as name
FROM [items] item inner join
[package] p
on item.pack_id= p.pack_id left join
[brands] bi
on bi.brand_id = item.brand_id left join
brands bp
on b.brand_id = p.brand_id
where p.pack_id = 1
group by coalesce(bi.name, bp.name), p.descr;
这种方法的一个关键优势是性能。当联接处于表达式或or
条件时,数据库往往做得很差。