我有4张桌子
tbLicenceTypesX(2个字段)
tbLicenceTypesX(包含类似的数据)
1 - 医疗执照
2 - 属性
3 - 伤亡
4 - 培训许可证
tbProduct(3个领域)
产品
了ProductX
CompanyId(F.K)
LicenceTypes(F.K)
tbProduct(包含类似数据)
1 - T.V - 10 - 2
2 - A.C - 30 - 3
3 - 手机 - 40 -4
tbLicence(3场)
许可证
LicenceTypesNames
AGENTID
tbLicence(包含类似的数据)
1 - 财产,伤亡 - 23
2 - 培训执照,伤亡人员 - 34
现在我必须从tbProduct获取Product和ProductX,其LicenceTypes与公司的tbLicence中的Agent的许可证匹配。
例如:我必须获取T.V,其许可类型为2(“财产”),公司ID为10,应分配给代理ID为23的代理,其LicenceTypesNames也应包含“Property”
我想要获取类似
的内容 @CompanyId int,
@AgentId int
As
SELECT p.ProductX,p.Product
from tbProduct p
inner join tbLicence l on p.LicenceTypes = l.LicenceTypesNames<its corresponding Id>
inner join tbProduct c on c.Product =p.Product
where
c.CompanyId=@CompanyId
and l.AgentId=@AgentId
请帮帮我!!!
答案 0 :(得分:1)
您可以使用XML
和CROSS APPLY
将comma
分隔的值和JOIN
与tbProduct
分开。 LTRIM
和RTRIM
函数用于修剪逗号分隔值(如果它们具有过多的空白空间)。以下代码为您提供所需的输出。
DECLARE @CompanyId int = 30, @AgentId int = 23
;WITH CTE AS
(
SELECT AgentId, TCT.LicenceTypes FROM
(
SELECT AgentId, LTRIM(RTRIM(Split.XMLData.value('.', 'VARCHAR(100)'))) LicenceTypesNames FROM
(
SELECT AgentID, Cast ('<M>' + REPLACE(LicenceTypesNames, ',', '</M><M>') + '</M>' AS XML) AS Data
FROM tbLicence
) AS XMLData
CROSS APPLY Data.nodes ('/M') AS Split(XMLData)
)
AS LTN
JOIN tbLicenceTypesX TCT ON LTN.LicenceTypesNames = tct.LicenceTypesX
)
SELECT p.ProductX,p.Product
FROM tbProduct P
JOIN CTE c on p.LicenceTypes = c.LicenceTypes
WHERE CompanyId = @CompanyId
AND AgentId = @AgentId