2016-12-27 61 views
0

我有兩張桌子。如何根據另一個表中具有多個值的列值選擇表中的行?

用戶與列用戶ID,面積

Area柱與多個逗號分隔值填充(從列表框) - 數據是這樣的:

User1 KA,TN,AP,GJ 
User2 MH,UP,MP,GJ 

訂單與列的OrderID,產品編號,數量,區域

數據如下所示:

1 Prod1 10 GJ 
2 Prod1 22 MH 
3 Prod2 3 AP 
4 Prod2 77 TN 

如何根據User表從Order表中選擇行?

說登錄的用戶是User1。他的領域是KA,TN,AP,GJ

結果應該是這樣的:

Prod1 10 GJ 
Prod2 77 TN 

請告知SQL查詢來得到這樣的結果。
永遠不要將數據存儲爲逗號分隔的項目:

感謝和問候 克里希納

+4

如果你的數據是標準化的,這會容易得多。爲什麼將多個值作爲一個字符串blob存儲在單個字段中? – David

+2

永遠不要將數據存儲爲逗號分隔的項目。這隻會導致你很多麻煩。 – jarlh

+2

閱讀[在數據庫列中存儲分隔列表真的不好嗎?](http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-那壞),你會看到很多原因,爲什麼這個問題的答案是**絕對是!** –

回答

1

因爲上述說所有評論不要設置此方案作爲一個很好的做法。

解決方法: -

操縱所選擇的形式user表用於通過使用Replace函數作爲下一個演示得到一個很好的結構中的值: -

Create table #user (username varchar(10), Areas varchar (100)) 
go 
insert into #user values ('User1', 'KA,TN,AP,GJ') 
insert into #user values ('User2', 'MH,UP,MP,GJ') 
go 
Create table #order (OrderID int , ProductID varchar(10), Qty int , Area char (2)) 
go 
insert into #order values (1, 'Prod1', 10, 'GJ') 
insert into #order values (2, 'Prod1', 22, 'MH') 
insert into #order values (3, 'Prod2', 3, 'AP') 
insert into #order values (4, 'Prod2', 77, 'TN') 
go 

declare @List nvarchar(250) 

select @List = '('''+(select Areas from #user where username = 'User1') + ''')' 
select @List = replace(@List,',',''',''') 


exec ('select ProductID,Qty, area from #order 
where Area in' + @List) 

drop table #user 
drop table #order 

結果: -

enter image description here

注意:我認爲第三條記錄錯誤地出現在您想要的結果集中。

+0

謝謝艾哈邁德..完美的工作。 – nkrishna

+0

@nkrishna很高興幫助你,兄弟:) –

0

可以使用patindex

select o.* 
from u 
join o on patindex('%,'+o.Area+',%', ','+u.area+',')>0 
where userid= 'User1' 
0

數據存儲爲逗號分隔的項目是不是一個好的做法。 但是你可以嘗試下面的東西

DECLARE @V_USER NVARCHAR(100) ='User1' 

SELECT * 
FROM Order AS O 
    INNER JOIN User AS U ON U.Area LIKE '%'+O.Area+'%' 
WHERE U.UserId = @V_USER 
相關問題