表 A
    编号    金额              数据来源
   00001    1000   /1370/1371/1372/1373/1374/
表 B
    编号    金额   
   1370     200
   1371     100
   1372     300
   1373     150
   1374     250
要实现的查询结果
    分类   编号    金额
    总计   00001   1000 
    明细   1370     200
    明细   1371     100
    明细   1372     300
    明细   1373     150
    明细   1374     250
查询注释:总计是表A的数据, 明细时表B的数据表B与表A通过数据来愈记录的数据关联时通过查询A表的数据,然后通过数据来源调用B表的明细数据,这只是个简单的例子,这个查询该怎么写,这是一个问题,另外数据来源字段实际存储的数据绝对不止这几条,最少都在500个记录表B的编号,怎么样可以使其查询速度快?

解决方案 »

  1.   

    select '总计' as 分类,编号,金额 fron A
    union all
    select '明细',编号,金额 from B
      

  2.   

    select 分类,编号,金额 from(
    select 编号 as id,'总计' as 分类,编号,金额 fron A
    union all
    select A.编号 as id,'明细',B编号, B.金额 from B inner join A on charindex(B.分类,A.数据来源)>0
    )t order by id
      

  3.   


    if object_id('ta') is not null
    drop table ta
    go
    create table ta(编号 varchar(5), 金额 int,数据来源 varchar(50))
    insert into ta 
    select   '00001', 1000, '/1370/1371/1372/1373/1374/'if object_id('tb') is not null
    drop table tb
    go
    create table tb(编号 varchar(5), 金额 int)
    insert into tb
    select   '1370', 200 union all
    select   '1371', 100 union all
    select   '1372', 300 union all
    select   '1373', 150 union all
    select   '1374', 250declare @s varchar(100)
    set @s =(select 数据来源 from ta  )
    set @s=left(right(@s,len(@s)-1) ,len(right(@s,len(@s)-1))-1)
    print @s
    declare @tb table (分类 nvarchar(10),编号 varchar(5), 金额 int)
    insert into @tb
    select '总计',编号,金额 from ta
    while charindex('/',@s)>0
    begin 
        insert into @tb 
        select '明细',编号,金额 from tb
        where 编号=left(@s,charindex('/',@s)-1)
        set @s=right(@s,len(@s)-charindex('/',@s))
    end 
    insert into @tb 
    select '明细',编号,金额 from tb
    where 编号=@s
    select * from @tb  总计 00001 1000  
      明细 1370 200
      明细 1371 100
      明细 1372 300
      明细 1373 150
      明细 1374 250
      

  4.   


    你写的是对的,不过@s存储不下数据来愈字段的数据怎么办,我们现在那个地方时用TEXT来存储的,也就是说实际的数据来源里面的东西很多,因为表B的编号在不断的变大。varchar到后面存储不下
      

  5.   

    create table a(编号 varchar(10),金额 int ,数据来源 varchar(100))
    create table b(编号 varchar(10),金额 int)
    insert into a
    select ' 00001', 1000, '/1370/1371/1372/1373/1374/'
    insert into b
    select '1370', 200 union all
    select '1371', 100 union all
    select '1372', 300 union all
    select '1373', 150 union all
    select '1374' ,250
    go
    select 分类='总计' ,编号,金额 from a
    union all
    select 分类='明细',编号,金额 from b
      

  6.   

    IF OBJECT_ID('TA') IS NOT NULL DROP TABLE TA
    GO
    IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
    GO
    CREATE TABLE TA
    (
       编号 nvarchar(50),
       金额 int,
       数据来源 nvarchar(1000)
    )
    CREATE TABLE TB
    (
       编号 nvarchar(50),
       金额 int,
    )
    INSERT INTO TA
    SELECT '00001',1000,'/1370/1371/1372/1373/1374/' 
    INSERT INTO TB
    SELECT '1370',200 UNION ALL
    SELECT '1371',100 UNION ALL
    SELECT '1372',300 UNION ALL
    SELECT '1373',150 UNION ALL
    SELECT '1374',250 
    ALTER FUNCTION FindId
        (@COL VARCHAR(50))
    RETURNS @IdTable TABLE
    (编号  VARCHAR(50))
    AS 
    BEGIN
       SELECT @COL=数据来源 FROM TA WHERE 编号=@COL
       WHILE CHARINDEX('/',@COL)>0
       BEGIN
          INSERT INTO @IdTable
          SELECT LEFT(@COL,CHARINDEX('/',@COL)-1)
          SET @COL=STUFF(@COL,1,CHARINDEX('/',@COL),'')
       END
       IF LEN(@COL)>0
       BEGIN
          INSERT INTO @IdTable
          SELECT @COL
       END
       RETURN
    END
    GODECLARE @编号 NVARCHAR(50)
    SET @编号='00001'
    SELECT '总计' as 分类,编号,金额 FROM TA WHERE 编号=编号 UNION ALL
    SELECT '明细',T.编号,T.金额 FROM TB T JOIN (SELECT * FROM FindId(@编号)) AS S ON T.编号=S.编号   
      

  7.   

    select 编号,金额 from ta
    union all
    select tb.编号,tb.金额 from 
    (
    SELECT A.[values],id=SUBSTRING(A.[values], B.number, CHARINDEX('/', A.[values] + '/', B.number) - B.number),number 
    FROM ta A,master..spt_values  B 
    WHERE  b.type='p' and SUBSTRING( A.[values], B.number, 1) = '/'
    ) t inner join tb on t.id=tb. 编号
      

  8.   

    CREATE TABLE #TA
    (
       编号 nvarchar(50),
       金额 int,
       数据来源 nvarchar(1000)
    )
    CREATE TABLE #TB
    (
       编号 nvarchar(50),
       金额 int,
    )
    INSERT INTO #TA
    SELECT '00001',1000,'/1370/1371/1372/1373/1374/' 
    INSERT INTO #TB
    SELECT '1370',200 UNION ALL
    SELECT '1371',100 UNION ALL
    SELECT '1372',300 UNION ALL
    SELECT '1373',150 UNION ALL
    SELECT '1374',250 select 分类,编号,金额 from(
    select 编号 as id,'总计' as [分类],编号,金额 from #tA
    union all
    select #tA.编号 as id,'明细'as [分类],#tB.编号, #tB.金额 from #tB inner join #tA on charindex('/'+#tB.编号+'/','/'+#tA.数据来源+'/')>0
    )t order by id