如何根据具有多个值的另一个表中的列值从表中选择行?

时间:2016-12-27 12:19:41

标签: sql sql-server

我有两张桌子。

用户,其中包含UserId,Area

Area列填充了多个逗号分隔值(来自列表框) - 数据如下所示:

User1 KA,TN,AP,GJ
User2 MH,UP,MP,GJ
使用列OrderID,ProductID,Qty,Area

订单

数据如下所示:

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查询以获得此结果。

谢谢和问候 克里希纳

3 个答案:

答案 0 :(得分: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

注意:我假设错误地在您想要的结果集中缺少第3条记录。

答案 1 :(得分:0)

您可以使用patindex

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

答案 2 :(得分: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