复杂连接中的问题

时间:2015-03-27 07:14:24

标签: sql-server sql-server-2008 sql-server-2008-r2

我有4张桌子

tbLicenceTypesX(2个字段)

  • LicenceTypes
  • LicenceTypesX

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

请帮帮我!!!

1 个答案:

答案 0 :(得分:1)

您可以使用XMLCROSS APPLYcomma分隔的值和JOINtbProduct分开。 LTRIMRTRIM函数用于修剪逗号分隔值(如果它们具有过多的空白空间)。以下代码为您提供所需的输出。

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