SQL Server - 连接混淆中的OR子句

时间:2014-12-04 11:05:15

标签: sql sql-server

我有如下表格结构

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
你可以告诉我的代码有什么问题吗?提前谢谢。

2 个答案:

答案 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条件时,数据库往往做得很差。