复杂联接中的问题
Issue in complicated join
我有4张桌子
tbLicenceTypesX(2 个字段)
- 许可证类型
- LicenceTypesX
tbLicenceTypesX(包含类似数据)
1 - 医疗执照
2 - 属性
3 - 伤亡
4 - 培训执照
tbProduct(3 个字段)
产品
ProductX
公司 ID (F.K)
许可证类型(F.K)
tbProduct(包含类似数据)
1 - T.V - 10 - 2
2 - A.C - 30 - 3
3 - 手机 - 40 -4
tbLicence(3 个领域)
执照
许可证类型名称
AgentId
tbLicence(包含类似数据)
1 - 属性,伤亡 - 23
2 - 培训执照,伤亡 - 34
现在我必须从 tbProduct 中获取 Product 和 ProductX,其 LicenceTypes 与 Company 中 tbLicence 中的 Agent's License 相匹配。
例如:我必须获取 T.V 其许可证类型为 2("Property") 且公司 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
请帮帮我!!!
您可以使用 XML
和 CROSS APPLY
将 comma
分隔值和 JOIN
与 tbProduct
分开。 LTRIM
和 RTRIM
函数用于 trim 逗号分隔值,如果它们有过多的空值 space。下面的代码为您提供了所需的输出。
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
我有4张桌子
tbLicenceTypesX(2 个字段)
- 许可证类型
- LicenceTypesX
tbLicenceTypesX(包含类似数据)
1 - 医疗执照
2 - 属性
3 - 伤亡
4 - 培训执照
tbProduct(3 个字段)
产品
ProductX
公司 ID (F.K)
许可证类型(F.K)
tbProduct(包含类似数据)
1 - T.V - 10 - 2
2 - A.C - 30 - 3
3 - 手机 - 40 -4
tbLicence(3 个领域)
执照
许可证类型名称
AgentId
tbLicence(包含类似数据)
1 - 属性,伤亡 - 23
2 - 培训执照,伤亡 - 34
现在我必须从 tbProduct 中获取 Product 和 ProductX,其 LicenceTypes 与 Company 中 tbLicence 中的 Agent's License 相匹配。
例如:我必须获取 T.V 其许可证类型为 2("Property") 且公司 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
请帮帮我!!!
您可以使用 XML
和 CROSS APPLY
将 comma
分隔值和 JOIN
与 tbProduct
分开。 LTRIM
和 RTRIM
函数用于 trim 逗号分隔值,如果它们有过多的空值 space。下面的代码为您提供了所需的输出。
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