2014-12-04 26 views
0

我有一個像下面SQL服務器 - OR子句中加入混亂

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 

請問你能提出我的代碼有什麼問題嗎?提前致謝。

回答

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

我傾向於通過獲得品牌這個包來實現這個目標。然後決定在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條件時,數據庫往往做得不好。