我正在开发诊所管理应用程序。
在该应用程序中,医生可以选择要使用的部分。
例如,当医生检查病人时,会使用并丢弃一副手套和木棍。
我使用的技巧很简单,就是在服务表中创建一个字符串,该字符串具有用逗号分隔的ID(类似于1,3,7,
之类的东西),并且除了一种情况外,它都可以正常工作。
在这种情况下,我想将用完的项目名称显示为一列,以显示多种服务。
我得到服务项一加服务项二,以此类推,作为所有服务项的一个字符串。
有什么办法可以解决吗?
我知道这听起来很复杂,但是如果它能奏效的话,您还会读到很多。
我用来加入的方式是:
on CHARINDEX(CAST(TblSupply.IDSupply as varchar(10)), TblService.UsedSupplyIDs) > 0
简单地,我将用过的商品ID TblSupply.IDSupply
转换为字符串,然后检查服务表中是否存在。
当我显示为单独的列时,它可以正常工作,但对于相同的服务,我会得到多行,如下所示:
Select
TblService.ServiceName,
TblSupply.SupplyName
from
TblService
left join TblSupply on CHARINDEX(CAST(TblSupply.IDSupply as varchar(10)), TblService.UsedSupplyIDs) > 0
例如
_____________________________________________
|TblService.ServiceName|TblSupply.SupplyName |
|Patient examination |Glove |
|Patient examination |wood stick |
|Patient examination |thermometer |
|Sonar examination |Glove |
|Sonar examination |lubricating Gel |
|Consultation |Glove |
|______________________|_____________________|
我想得到
________________________________________________________
|TblService.ServiceName|xxxxx |
|Patient examination |Glove ,wood stick , thermometer |
|Sonar examination |Glove,lubricating Gel |
|Consultation |Glove |
我编写的代码
Select
TblService.ServiceName,TempTable.SupplyList
from
TblService
left join (Select TblService.IDService As IDService,
STUFF((Select ', ' + TblSupply.SupplyName
FROM
TblService
left join TblSupply on CHARINDEX(CAST(TblSupply.IDSupply as varchar(10)), TblService.UsedSupplyIDs) > 0
FOR XML PATH('')), 1, 1, '') as SupplyList
FROM
TblService
GROUP BY
TblService.IDService
) as TempTable on TempTable.IDService=TblService.IDService
我尝试过
Select
TblPatientService.IDPatientService,
TblService.ServiceName,
TempTable.SupplyList
from
TblPatientService
left Join TblService On TblService.IDService = TblPatientService.IDService
left join (Select TblPatientService.IDPatientService As IDPatientService
STUFF((Select ', ' + TblSupply.SupplyName
FROM
TblPatientService
left join TblService on TblService.IDService = TblPatientService.IDService
left join TblSupply on CHARINDEX(CAST(TblSupply.IDSupply as varchar(10)), TblService.UsedSupplyIDs) > 0
WHERE
TblPatientService.IDService = TblService.IDService
FOR XML PATH('')), 1, 1, '') as SupplyList
FROM
TblPatientService
left Join TblService On TblService.IDService = TblPatientService.IDService
GROUP BY
TblPatientService.IDPatientService
) as TempTable on TempTable.IDPatientService = TblPatientService.IDPatientService
我真正得到的
|TblService.ServiceName|xxxxx
|Patient examination |Glove ,wood stick , thermometer,Glove,lubricating Gel,Glove,lubricating Gel |
|Sonar examination |Glove ,wood stick , thermometer,Glove,lubricating Gel,Glove,lubricating Gel |
|Consultation |Glove ,wood stick , thermometer,Glove,lubricating Gel,Glove,lubricating Gel |
换句话说,我得到所有服务的所有已用项目,就好像它们用于所有显示的一项服务。
答案 0 :(得分:1)
自SQL Server 2017起,您可以使用STRING_AGG。像这样:
SELECT TblPatientService.IDPatientService AS IDPatientService,
STRING_AGG(TblSupply.SupplyName, ', ') AS SupplyList
FROM TblPatientService
LEFT OUTER JOIN TblService ON TblService.IDService = TblPatientService.IDService
LEFT OUTER JOIN TblSupply ON CHARINDEX(CAST(TblSupply.IDSupply AS VARCHAR(10)), TblService.UsedSupplyIDs) > 0
GROUP BY TblPatientService.IDPatientService;
替换XML东西!
答案 1 :(得分:1)
这个评论太长了。
我强烈建议您修复数据模型。在数据库列中存储定界列表是一种典型的设计反模式,它将以不同的方式(复杂性,效率,维护,数据完整性)适得其反。您可以查看this famous SO question了解更多详细信息。
例如:对于一些长度超过一位数(通常为1会匹配10)的供应ID,您当前的加入条件将无法满足您的期望。
您应该规范化模型,并有一个单独的表来存储服务和供应之间的N-M关系,每行一个元组。