<s s_sec="免疫室" s_ite="EB病毒抗体" >
  <d D_det="EB病毒抗体" D_unit="" D_num=":" >
    <ds Ds_nam="阳性" /> 
    <ds Ds_nam="阴性" />
  </d>
</s>
要形成这样的层次关系~~!!
谢谢,不会也帮我顶啊!!!

解决方案 »

  1.   


    SELECT 
    s.*, 
    d.[D_det], d.[D_unit], d.[D_num],
    ds.Ds_nam
    FROM(
    SELECT DISTINCT
    [s_sec], [s_ite]
    FROM [Test]
    )s
    INNER JOIN(
    SELECT DISTINCT
    [s_sec], [s_ite], [D_det], [D_unit] = RTRIM([D_unit]), [D_num]
    FROM [Test]
    )d
    ON s.[s_sec] = d.[s_sec]
    AND s.[s_ite] = d.[s_ite]
    INNER JOIN [Test] ds
    ON ds.[s_sec] = d.[s_sec]
    AND ds.[s_ite] = d.[s_ite]
    AND ds.[D_det] = d.[D_det]
    FOR XML AUTO
      

  2.   

    -- 结果<s s_sec="免疫室" s_ite="甲胎蛋白(AFP)">
      <d D_det="甲胎蛋白(AFP)" D_unit="ug/l" D_num="20:">
        <ds />
      </d>
    </s>
    <s s_sec="免疫室" s_ite="癌胚抗原(CEA)">
      <d D_det="癌胚抗原(CEA)" D_unit="ug/l" D_num="15:">
        <ds />
      </d>
    </s>
    <s s_sec="免疫室" s_ite="EB病毒抗体">
      <d D_det="EB病毒抗体" D_num=":">
        <ds Ds_nam="阴性" />
        <ds Ds_nam="阳性" />
        <ds />
      </d>
      <d D_det="戊肝抗体IgG" D_num=":">
        <ds />
      </d>
      <d D_det="IgM" D_unit="G/L" D_num="0.5:2.2">
        <ds />
      </d>
      <d D_det="IgG" D_unit="G/L" D_num="8.0:16.0">
        <ds />
      </d>
      <d D_det="补体C3" D_unit="g/l" D_num="0.8:1.6">
        <ds />
      </d>
      <d D_det="补体C4" D_unit="g/l" D_num="0.1:0.4">
        <ds />
      </d>
    </s>
    <s s_sec="免疫室" s_ite="前列腺特异性抗原(PSA)">
      <d D_det="前列腺特异性抗原(PSA)" D_unit="ug/L" D_num="0:4.0">
        <ds />
      </d>
      <d D_det="戊肝抗体IgG" D_num=":">
        <ds />
      </d>
      <d D_det="IgM" D_unit="G/L" D_num="0.5:2.2">
        <ds />
      </d>
      <d D_det="IgG" D_unit="G/L" D_num="8.0:16.0">
        <ds />
      </d>
      <d D_det="补体C3" D_unit="g/l" D_num="0.8:1.6">
        <ds />
      </d>
    </s>
      

  3.   

    我那个是2005, 如果楼主不要  <ds /> 这样的数据, 可以加条件过滤掉
      

  4.   

    终于看见邹大哥了,前几天刚买了你的书,还热呼呢!
    今年刚毕业,感觉要学的东西太多了,特别是数据库方面的,以后还找你问,哈哈!!
    过滤<ds>我会啊,加hide就可以了.
    本来我也不会去用EXPLICIT的,后来发现有些<d>标签检索时出不来,查来查去,发现一个致命的逻辑错误,s,d,ds三个表都是内联的,有些d在ds中是没有数据的,而页面上取XML数据的格式已经被我定死了改起来回很麻烦的[那个体检登记页面我做了一个礼拜],真的不想改了,只能专下牛角尖.
    后来发现,我数据库的基础还是不怎么样啊,只要该为[左连接]就可以解决这个问题的.下面是我没改之前的存储过程:
    IF EXISTS (SELECT name 
       FROM   sysobjects 
       WHERE  name = N'sp_UTtemplete_xml' 
       AND    type = 'P')
        DROP PROCEDURE sp_UTtemplete_xml
    GO
    CREATE PROCEDURE sp_UTtemplete_xml
    @t_hao varchar(40), --体检号
    @d_hao varchar(40) --档案号
    AS
    DECLARE @Istr varchar(40), --项目集(以|分割的数据)
    @Itype varchar(40) --类型
    SET @Itype = (SELECT B_opt FROM B_check WHERE B_id = @t_hao AND R_id = @d_hao)
    SET @Istr = (
    CASE @Itype
    WHEN '项' THEN (SELECT B_con FROM B_check WHERE B_id = @t_hao AND R_id = @d_hao)
    WHEN '套' THEN (SELECT c.S_id FROM Ce_meal c,B_check b WHERE c.Ce_id = b.Ce_id AND B_id = @t_hao AND R_id = @d_hao)
    WHEN '套+项' THEN (SELECT c.S_id + '|' + b.B_con FROM Ce_meal c,B_check b WHERE c.Ce_id = b.Ce_id AND B_id = @t_hao AND R_id = @d_hao)
    ELSE '|' --防止无数据的错误
    END
    )SELECT  s.s_sec, --科名
    s.s_ite, --项目名称
    d.D_det, --小项名称
    d.D_unit, --单位
    d.D_num, --数据范围
    ds.Ds_nam --参考值
    FROM  S_item s,D_detail d,Ds_falues ds
    WHERE  s.s_id in (select * from dbo.f_splitstr(@Istr,'|'))
    and s.s_id = d.S_id and d.D_id = ds.D_id
    ORDER BY s.s_sec,s.s_ite,d.D_det
    FOR XML AUTO
    Go//-------------------------------
    这样的存储过程还能改进吗?会不会有效率问题?哈哈,thank you! thank you!