3

如何创建类似数据并关联回链接的密钥。

下面的示例显示了原始数据和所需输出的方式。

DECLARE @Data TABLE (PID INT, CID INT)

INSERT INTO @Data
VALUES (1, 1), (1, 2), (1, 3), (3, 1), (3, 2), (3, 3), (2, 1), (2, 2), (4, 3), (4, 4),  
       (5, 4), (5, 5), (8, 4), (8, 5), (6, 6), (7, 4), (7, 5), (7, 6)

在上面的数据中,1、2、3 的 CID 集与 1、2 不同。这些是唯一

我想结交

PID 1 和 3 到集合 1、2、3。

PID 2 设置 1, 2

PID 4 设置 3, 4

PID 5 和 8 设置 4, 5

等等

总体目标是返回类似于以下内容的 XML:

<Items>
  <Item>
    <Hierarchies>
        <Hierarchy>
           <CID>1</CID>
           <CID>2</CID>
           <CID>3</CID>
        </Hierarchy>
    </Hierarchies>
    <PIDs>
        <PID>1</PID>
        <PID>3</PID>
    </PIDs>
  </Item>
  <Item>
    <Hierarchies>
        <Hierarchy>
           <CID>1</CID>
           <CID>2</CID>
        </Hierarchy>
    </Hierarchies>
    <PIDs>
        <PID>2</PID>
    </PIDs>
  </Item>
  <Item>
    <Hierarchies>
        <Hierarchy>
           <CID>3</CID>
           <CID>4</CID>
        </Hierarchy>
    </Hierarchies>
    <PIDs>
        <PID>4</PID>
    </PIDs>
  </Item>
  <Item>
      ... Etc ...
  </Item>
<Items>
4

1 回答 1

4

像这样的东西?还是我误解了?

    DECLARE @Data TABLE (PID INT, CID INT)

    INSERT INTO @Data
    VALUES (1, 1), (1, 2), (1, 3), (3, 1), (3, 2), (3, 3), (2, 1), (2, 2), (4, 3), (4, 4),  
           (5, 4), (5, 5), (8, 4), (8, 5), (6, 6), (7, 4), (7, 5), (7, 6)

    with cid_xml as (   select P.PID
                               ,OA.CID
                        from @Data P
                        outer apply (select CAST((select C.CID 
                                                     from @Data C
                                                  where C.PID = P.PID

                                                  for xml path('')) as varchar(max)) as CID 
                                    ) OA
                    )
    select cast((select cast(C2.CID as xml) as 'hierarchies/hierarchy'
                        ,cast(OA2.PID as xml) as 'PIDs'
                from cid_xml C2
                outer apply (select CAST((select C3.PID 
                                             from cid_xml C3
                                          where C3.CID = C2.CID
                                          group by C3.PID
                                          for xml path('')) as varchar(max)) as PID 
                            )OA2
                group by C2.CID,OA2.PID
                order by LEN(C2.CID) desc
                for xml path('item')) as xml)
    for xml path('Items')

我只是按顺序查看项目/层次结构/层次结构的第一个节点,就像您在目标结果样本中所做的那样

我得到的结果是

  <Items>
    <item>
      <hierarchies>
        <hierarchy>
          <CID>1</CID>
          <CID>2</CID>
          <CID>3</CID>
        </hierarchy>
      </hierarchies>
      <PIDs>
        <PID>1</PID>
        <PID>3</PID>
      </PIDs>
    </item>
    <item>
      <hierarchies>
        <hierarchy>
          <CID>4</CID>
          <CID>5</CID>
          <CID>6</CID>
        </hierarchy>
      </hierarchies>
      <PIDs>
        <PID>7</PID>
      </PIDs>
    </item>
    <item>
      <hierarchies>
        <hierarchy>
          <CID>3</CID>
          <CID>4</CID>
        </hierarchy>
      </hierarchies>
      <PIDs>
        <PID>4</PID>
      </PIDs>
    </item>
    <item>
      <hierarchies>
        <hierarchy>
          <CID>4</CID>
          <CID>5</CID>
        </hierarchy>
      </hierarchies>
      <PIDs>
        <PID>5</PID>
        <PID>8</PID>
      </PIDs>
    </item>
    <item>
      <hierarchies>
        <hierarchy>
          <CID>1</CID>
          <CID>2</CID>
        </hierarchy>
      </hierarchies>
      <PIDs>
        <PID>2</PID>
      </PIDs>
    </item>
    <item>
      <hierarchies>
        <hierarchy>
          <CID>6</CID>
        </hierarchy>
      </hierarchies>
      <PIDs>
        <PID>6</PID>
      </PIDs>
    </item>
  </Items>

没关系?

于 2013-01-24T15:41:27.800 回答