【问题标题】:How to select rows from a table based on a column value in another table that has multiple values?如何根据另一个具有多个值的表中的列值从表中选择行?
【发布时间】:2023-03-10 22:52:01
【问题描述】:

我有两张桌子。

用户,包含 UserId、Area 列

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

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

Order,包含 OrderID、ProductID、Qty、Area 列

数据如下所示:

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 查询提出建议。

感谢和问候 克里希纳

【问题讨论】:

  • 如果你的数据被规范化了会容易很多。为什么要将多个值作为一个字符串 blob 存储在单个字段中?
  • 永远不要将数据存储为逗号分隔的项目。只会给你带来很多麻烦。
  • 阅读Is storing a delimited list in a database column really that bad?,您会在其中看到为什么这个问题的答案是绝对是的!
  • 为什么结果集中缺少第三条记录?区域“AP”也链接到“User1”。

标签: sql sql-server


【解决方案1】:

不要将此解决方案设置为一种好的做法,因为正如上面所有 cmets 所说的
永远不要将数据存储为逗号分隔的项目。

解决方法:-

通过使用Replace 函数作为下一个演示来操作从user 表中选择的值以获得良好的结构:-

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

结果:-

注意:我误以为您想要的结果集中缺少第 3 条记录。

【讨论】:

  • @nkrishna 很高兴帮助你,兄弟 :)
【解决方案2】:

你可以使用patindex

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

【讨论】:

    【解决方案3】:

    将数据存储为逗号分隔项不是一个好习惯。 但是你可以试试下面的方法

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 2020-02-16
      • 2021-03-27
      • 1970-01-01
      • 2020-05-27
      相关资源
      最近更新 更多