2016-12-27 2 views
0

私は2つのテーブルを持っています。列ユーザーIDと複数の値を持つ別のテーブルの列の値に基づいてテーブルから行を選択する方法はありますか?

ユーザー、エリア

Areaカラムを(リストボックスから)複数のカンマ区切り値が移入された - データは、次のようになります、

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

注文列受注コードとProductID、数量、面積

データは次のようになります。

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

Orderからテーブルを選択する方法Userに基づくテーブル?

ログインしたユーザーはUser1です。彼のエリアはKA,TN,AP,GJです。

結果は次のようになります。

Prod1 10 GJ 
Prod2 77 TN 

この結果を得るために、SQLクエリについて助言してください。
は決して、これまでにカンマ区切りのアイテムなどのデータを保存しない:すべてのコメントとして上に言ったので

おかげに関して クリシュナは

+4

データが正規化されていればもっと簡単になるでしょう。 1つのフィールドに複数の値を1つの文字列ブロブとして格納するのはなぜですか? – David

+2

絶対にコンマ区切りの項目としてデータを保存しないでください。それはあなたに多くのトラブルを引き起こすだけです。 – jarlh

+2

[データベース列に区切られたリストを実際に格納するのは本当に悪いですか?](http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-その悪い)、あなたはこの質問への答えは**絶対にはいです理由の多くを参照してください!** –

答えて

1

は良い習慣として、このソリューションを設定しないでください。

回避方法: - :

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 

結果: - -

次のデモとしてReplace関数を用い介し良い構造を取得するためのフォームuserテーブルを選択された値を操作

enter image description here

注:誤って希望の結果セットに3番目のレコードがないと仮定しました。

+0

ありがとうございました。 – nkrishna

+0

@nkrishnaあなたを助けてうれしい、bro :) –

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 
関連する問題