2017-09-28 35 views
1

我在3個表「table1」,「table2」,「tableMap」上寫了一個查詢。基於下拉列表中的選定值。但我沒有得到預期的結果。請幫忙。帶有多個過濾器的SQL Server查詢

下拉1:

<Promo Name> 
- All - value = "" 
- ABC - value = "1" 
- XYZ - value = "2" 

下拉2:

<Store Type> 
- All - value = "" 
- Type 1 - value = "1" 
- Type 2 - value = "2" 

下拉3:

<Store Area> 
- All - value = "" 
- Area 1 - value = "1" 
- Area 2 - value = "2" 

表1:

ID | Store Name | Store Address | Store Type | Store Area 
---+------------+---------------+------------+----------- 
1 | ABC  | 112 test road| Type 1  | Area 1 
2 | XYZ  | 22 test2 road| Type 2  | Area 2 

表2:

ID | Promo Name 
---+------------ 
1 | promo 1  
2 | promo 2  

表地圖:

ID | Promo ID | Store Type | Store Area 
---+------------+----------------+------------+----------- 
1 | 1   | 2,1  | 
2 | 2   |   | 1 

爲[存儲類型]和[存儲區]的值是的ID [表1] 因此,在下面的查詢,我們應將[Store Type]/[Store Area]映射到[Table 1]的[ID]

我正在嘗試編寫查詢,以便根據下拉列表中的值選擇結果。

查詢:

declare @promoname varchar(255), 
     @type varchar(255), 
     @area varchar(255) 

select 
    t2.Promo Name, t2.ID, t1.Store Name, t1.Store Address 
from 
    [Tablemap] tm 
inner join 
    [Table2] t2 on tm.Promo ID = t2.ID 
where 
    (@promoname = '' or t2.[promoname] = @promoname) 
    and (@type = '' or @type in (select [name] 
           from dbo.SplitString (tm.Store Type))) 

結果 - 預期 - (但不是因爲我沒加上面,而不是位置表知道如何添加它上面的查詢工作):

Promo Name | Store Name | Address 
-----------+------------+--------------- 
promo 1 | ABC  | 112 test road 
promo 2 | ABC  | 112 test road 
+1

感謝您提供格式良好的示例。我在查詢中沒有看到表2。我看到t2的前綴爲值,但我沒有在from或join子句中看到它。 –

+1

希望'promo 2'在您想要的結果中與'ABC'相關聯的邏輯是什麼? –

+1

如果您可以修改「表格映射」的性質,以便它不包含商店類型ID的csv列表。每次促銷與特定區域或商店類型相關聯時,都會創建一個新行。這會讓你的生活更輕鬆。 – Greenspark

回答

1

請嘗試下面的代碼。

declare @promoname varchar(255), 
     @type varchar(255), 
     @area varchar(255) 

select t2.Promo Name, t2.ID, t1.Store Name, t1.Store Address 
from 
    [Tablemap] tm 
inner join [Table2] t2 on tm.Promo ID = t2.ID 
inner join [Table1] t1 on tm.Promo ID = t1.ID 
where (@promoname = '' or t2.[promoname] = @promoname) 
    and (@type = '' or t1.[Store Type] in (select [name] from dbo.SplitString (tm.Store Type)))