原户信息表、表一
户代码   姓名
30201    张三
30202    李四
30203    王五
30205    赵六分户记录表记录那一户有分户,
下表中35201,张三家分了两户出去,赵六家分了一户, 这些分户信息见表三,
表二
原户代码,分户后代码
30201    30206
30201    30207
30205    30208新分户未审核记录表,
此表数据审核后才进入表一
表三
户代码   姓名
30206    张三子1
30207    张三子2
30208    赵六子1为了便于审核
我想把有分户的原数据和从他分出去的新户数据分别挨在一起如下示例:
原户   30201    张三
分出户 30206    张三子1
分出户 30207    张三子2
原户   30205    赵六
分出户 30208    赵六子1

解决方案 »

  1.   

    [code=SQL]
    select
        t.类型,isnull(t.分户代码,t.户代码) as 户代码,t.姓名
    from
        (select 
             '原户' as 类型,n.户代码,null as 分户代码,n.姓名 
         from 
             原户信息表 n 
         where 
             exists(select 1 from 分户记录表 where 原户代码=n.户代码)
         union all
         select
             '分出户' as 类型,a.户代码,c.户代码 as 分户代码,c.姓名
         from
             原户信息表 a,分户记录表 b,新分户未审核记录表 c
         where
             a.户代码=b.原户代码 and b.分户后代码=c.户代码) t
    order by
        t.户代码,t.分户代码
    [/code]
      

  2.   

    SELECT [TYPE],[分出户],[姓名]
    FROM (
    SELECT '原户' 'TYPE',[户代码] '原户',[户代码] '分出户',[姓名] FROM [表一] T1 
    UNION ALL
    SELECT '分出户',T2.[原户代码],T2.[分户后代码],T3.[姓名]
    FROM [表二] T2
    INNER JOIN [表三] T3 ON T2.[分户后代码]=T3.[户代码]
    ) T
    ORDER BY [原户],CASE WHEN [TYPE]='原户' THEN 0 ELSE 1 END
      

  3.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2010-04-21 14:46:32
    -- Verstion:
    --      Microsoft SQL Server 2005 - 9.00.4053.00 (Intel X86) 
    -- May 26 2009 14:24:20 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[a]
    if object_id('[a]') is not null drop table [a]
    go 
    create table [a]([户代码] int,[姓名] varchar(4))
    insert [a]
    select 30201,'张三' union all
    select 30202,'李四' union all
    select 30203,'王五' union all
    select 30205,'赵六'
    --> 测试数据:[b]
    if object_id('[b]') is not null drop table [b]
    go 
    create table [b]([原户代码] int,[分户后代码] int)
    insert [b]
    select 30201,30206 union all
    select 30201,30207 union all
    select 30205,30208
    --> 测试数据:[c]
    if object_id('[c]') is not null drop table [c]
    go 
    create table [c]([户代码] int,[姓名] varchar(7))
    insert [c]
    select 30206,'张三子1' union all
    select 30207,'张三子2' union all
    select 30208,'赵六子1'
    --------------开始查询--------------------------
    select
        t.类型,isnull(t.分户代码,t.户代码) as 户代码,t.姓名
    from
        (select 
             '原户' as 类型,t.户代码,null as 分户代码,t.姓名 
         from 
             a t 
         where 
             exists(select 1 from b where 原户代码=t.户代码)
         union all
         select
             '分出户' as 类型,a.户代码,c.户代码 as 分户代码,c.姓名
         from
              a,  b,  c
         where
             a.户代码=b.原户代码 and b.分户后代码=c.户代码) t
    order by
        t.户代码,t.分户代码----------------结果----------------------------
    /* 类型     户代码         姓名
    ------ ----------- -------
    原户     30201       张三
    分出户    30206       张三子1
    分出户    30207       张三子2
    原户     30205       赵六
    分出户    30208       赵六子1(5 行受影响)
    */
      

  4.   

    create table #T1
    (
     户代码 nvarchar(50),
     姓名  nvarchar(50)
    )
    insert into #T1 select '30201','张三'
    insert into #T1 select '30202','张三'
    insert into #T1 select '30203','张三'
    insert into #T1 select '30205','张三'create table #T2
    (
     原户代码 nvarchar(50),
     分户后代码  nvarchar(50)
    )
    insert into #T2 select '30201','30206'
    insert into #T2 select '30201','30207'
    insert into #T2 select '30205','30208'create table #T3
    (
     户代码 nvarchar(50),
     姓名  nvarchar(50)
    )
    insert into #T3 select '30206','张三子1'
    insert into #T3 select '30207','张三子2'
    insert into #T3 select '30208','赵六子1'
    select * from #T3select distinct '原户',T1.户代码,T1.姓名 from #T1 T1
    join
    (
    select T2.原户代码,'分出户' 分出户,T3.户代码,T3.姓名 from #T2 T2
    join #T3 T3 on T2.分户后代码=T3.户代码
    ) T2
    on T1.户代码=T2.原户代码
    union all
    select '分出户' 分出户,T3.户代码,T3.姓名 from #T2 T2
    join #T3 T3 on T2.分户后代码=T3.户代码       户代码                                                姓名
    ------ -------------------------------------------------- --------------------------------------------------
    原户     30201                                              张三
    原户     30205                                              张三
    分出户    30206                                              张三子1
    分出户    30207                                              张三子2
    分出户    30208                                              赵六子1(5 行受影响)
      

  5.   


    create table #tt1(户代码 int, 姓名 varchar(20))
    insert #tt1 select 30201 ,'张三'
    insert #tt1 select 30202 ,'李四'
    insert #tt1 select 30203 ,'王五'
    insert #tt1 select 30205 ,'赵六'create table #tt2(原户代码 int,分户后代码 int)
    insert #tt2 select 30201, 30206
    insert #tt2 select 30201, 30207
    insert #tt2 select 30205, 30208create table #tt3(户代码 int, 姓名 varchar(20))
    insert #tt3 select 30206 ,'张三子1'
    insert #tt3 select 30207 ,'张三子2'
    insert #tt3 select 30208 ,'赵六子1'with cte as(
    select '原户' as stat,a.*,cast(户代码 as binary(4)) as path  from #tt1 a where exists(select 1 from #tt2 where a.户代码=原户代码)
    union all
    select '分出户',a.分户后代码,c.姓名,b.path+cast(row_number() over(partition by a.原户代码 order by 分户后代码) as binary(4))
    from #tt2 a
    ,(select *,cast(户代码 as binary(4)) as path  from #tt1) b
    ,#tt3 c
    where a.原户代码=b.户代码 and a.分户后代码=c.户代码
    )select stat,户代码,姓名   from cte 
    order by pathstat           户代码 姓名
    ------ ----------- --------------------
    原户           30201 张三
    分出户          30206 张三子1
    分出户          30207 张三子2
    原户           30205 赵六
    分出户          30208 赵六子1(5 行受影响)
      

  6.   

    鸭子的修改下:
    SELECT [TYPE],[分出户],[姓名]
    FROM (
    SELECT '原户' 'TYPE',[户代码] '原户',[户代码] '分出户',[姓名] FROM a T1  where exists(select 1 from b where 原户代码=t1.户代码)
    UNION ALL
    SELECT '分出户',T2.[原户代码],T2.[分户后代码],T3.[姓名]
    FROM b T2
    INNER JOIN c T3 ON T2.[分户后代码]=T3.[户代码]
    ) T
    ORDER BY [原户],CASE WHEN [TYPE]='原户' THEN 0 ELSE 1 END
      

  7.   


    create table #tt1(户代码 int, 姓名 varchar(20))
    insert #tt1 select 30201 ,'张三'
    insert #tt1 select 30202 ,'李四'
    insert #tt1 select 30203 ,'王五'
    insert #tt1 select 30205 ,'赵六'create table #tt2(原户代码 int,分户后代码 int)
    insert #tt2 select 30201, 30206
    insert #tt2 select 30201, 30207
    insert #tt2 select 30205, 30208create table #tt3(户代码 int, 姓名 varchar(20))
    insert #tt3 select 30206 ,'张三子1'
    insert #tt3 select 30207 ,'张三子2'
    insert #tt3 select 30208 ,'赵六子1'with cte as(
    select '原户' as stat,a.*,cast(户代码 as binary(4)) as path  from #tt1 a where exists(select 1 from #tt2 where a.户代码=原户代码)
    union all
    select '分出户',a.分户后代码,c.姓名,b.path+cast(row_number() over(partition by a.原户代码 order by 分户后代码) as binary(4))
    from #tt2 a
    ,(select *,cast(户代码 as binary(4)) as path  from #tt1) b
    ,#tt3 c
    where a.原户代码=b.户代码 and a.分户后代码=c.户代码
    )select stat,户代码,姓名   from cte 
    order by pathstat           户代码 姓名
    ------ ----------- --------------------
    原户           30201 张三
    分出户          30206 张三子1
    分出户          30207 张三子2
    原户           30205 赵六
    分出户          30208 赵六子1(5 行受影响)
      

  8.   

    create table #T1
    (
     户代码 nvarchar(50),
     姓名  nvarchar(50)
    )
    insert into #T1 select '30201','张三'
    insert into #T1 select '30202','张三'
    insert into #T1 select '30203','张三'
    insert into #T1 select '30205','张三'create table #T2
    (
     原户代码 nvarchar(50),
     分户后代码  nvarchar(50)
    )
    insert into #T2 select '30201','30206'
    insert into #T2 select '30201','30207'
    insert into #T2 select '30205','30208'create table #T3
    (
     户代码 nvarchar(50),
     姓名  nvarchar(50)
    )
    insert into #T3 select '30206','张三子1'
    insert into #T3 select '30207','张三子2'
    insert into #T3 select '30208','赵六子1'
    select * from #T3select distinct '原户' '户型',T1.户代码,T1.姓名 from #T1 T1
    join
    (
    select T2.原户代码,'分出户' 分出户,T3.户代码,T3.姓名 from #T2 T2
    join #T3 T3 on T2.分户后代码=T3.户代码
    ) T2
    on T1.户代码=T2.原户代码
    union all
    select '分出户' 分出户,T3.户代码,T3.姓名 from #T2 T2
    join #T3 T3 on T2.分户后代码=T3.户代码    户型     户代码                                                姓名
    ------ -------------------------------------------------- --------------------------------------------------
    原户     30201                                              张三
    原户     30205                                              张三
    分出户    30206                                              张三子1
    分出户    30207                                              张三子2
    分出户    30208                                              赵六子1(5 行受影响)
      

  9.   

    --------------------SQL Server数据格式化工具-------------------
    ---------------------------------------------------------------
    -- DESIGNER :happycell188(喜喜)
    --       QQ :584738179
    -- Development Tool :Microsoft Visual C++ 6.0    C Language 
    -- FUNCTION :CONVERT DATA TO T-SQL
    ---------------------------------------------------------------
    -- Microsoft SQL Server  2005
    -- Developer Edition on Microsoft Windows XP [版本 5.1.2600]
    ---------------------------------------------------------------
    ---------------------------------------------------------------use test
    go
    if object_id('test.dbo.tb1') is not null drop table tb1
    -- 创建数据表
    create table tb1
    (
    户代码 int,
    姓名 char(5)
    )
    go
    --插入测试数据
    insert into tb1 select 30201,'张三'
    union all select 30202,'李四'
    union all select 30203,'王五'
    union all select 30205,'赵六'
    go
    if object_id('test.dbo.tb2') is not null drop table tb2
    -- 创建数据表
    create table tb2
    (
    原户代码 int,
    分户后代码 int
    )
    go
    --插入测试数据
    insert into tb2 select 30201,30206
    union all select 30201,30207
    union all select 30205,30208
    go
    if object_id('test.dbo.tb3') is not null drop table tb3
    -- 创建数据表
    create table tb3
    (
    户代码 int,
    姓名 char(8)
    )
    go
    --插入测试数据
    insert into tb3 select 30206,'张三子1'
    union all select 30207,'张三子2'
    union all select 30208,'赵六子1'
    go
    --代码实现
    select * from (
    select '分出户' 类别,户代码,姓名 from tb2,tb3 where 分户后代码=户代码
    union select '原户' 类别,* from tb1 where 户代码 in(select 原户代码 from tb2))t
    order by 姓名,户代码/*测试结果类别 户代码 姓名
    ---------------------
    原户 30201 张三    
    分出户 30206 张三子1 
    分出户 30207 张三子2 
    原户 30205 赵六    
    分出户 30208 赵六子1 
    (5 行受影响)
    */
      

  10.   


    CREATE TABLE A(ID NVARCHAR(50),NAME NVARCHAR(50))
    CREATE TABLE B(A NVARCHAR(50),B NVARCHAR(50))
    CREATE TABLE C(ID NVARCHAR(50),NAME NVARCHAR(50))
    INSERT INTO A
    SELECT '30201', '张三'UNION
    SELECT '30202' ,'李四'UNION 
    SELECT '30203' ,'王五'UNION
    SELECT '30205' ,'赵六'
    INSERT INTO B
    SELECT '30201', '30206'UNION
    SELECT '30201' ,'30207'UNION 
    SELECT '30205' ,'30208'
    INSERT INTO C
    SELECT '30206', '张三子1'UNION
    SELECT '30207' ,'张三子2'UNION 
    SELECT '30208' ,'赵六子1'select id,name 
    from a
    where a.id in(select a from b)
    union all
    SELECT a.a+b.id id,b.name 
    FROM B A
    INNER JOIN C B ON b.ID=a.b
    order by id
    /*
    30201 张三
    3020130206 张三子1
    3020130207 张三子2
    30205 赵六
    3020530208 赵六子1
    */
      

  11.   

    --create table olduser(code varchar(100),name varchar(100))
    --create table newuser(oldcode varchar(100),newcode varchar(100))
    --create table nocheckuser(code varchar(100),name varchar(100))
    --insert into olduser
    --select '30201','张三' union
    --select '30202','李四' union
    --select '30203','王五' union
    --select '30204','赵六'
    --insert into newuser
    --select '30201','30206' union
    --select '30201','30207' union
    --select '30205','30208'
    --insert into nocheckuser
    --select '30206','张三子1' union
    --select '30207','张三子2' union
    --select '30208','赵六子1'
    select o.*,a.* from olduser o inner join newuser n on o.code=n.oldcode inner join nocheckuser a on n.newcode=a.code
    30201 张三 30206 张三子1
    30201 张三 30207 张三子2
    30205 赵六 30208 赵六子1这样还好看点