复杂联接中的问题

Issue in complicated join

我有4张桌子

tbLicenceTypesX(2 个字段)

tbLicenceTypesX(包含类似数据)

tbProduct(3 个字段)

tbProduct(包含类似数据)

tbLicence(3 个领域)

tbLicence(包含类似数据)

现在我必须从 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

请帮帮我!!!

您可以使用 XMLCROSS APPLYcomma 分隔值和 JOINtbProduct 分开。 LTRIMRTRIM 函数用于 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

Sql Fiddle Demo