日期:2014-05-18 浏览次数:20676 次
有表A code name zt 1 N1 ,0, 2 N2 ,0,4, 3 N3 ,0,4, 4 N4 ,0, 5 N5 ,0,4, 6 N6 ,0, ... 表B dm mc 001 M1 002 M2 003 M3 004 M4 005 M5 ... --需求TAB: --如表A含,4,就在表A数据列下方将表B的所有数据带到TAB,如不含,4,就不需要。 --如结果TAB: DM_NEW MC_NEW 1 N1 2 N2 001 M1 002 M2 003 M3 004 M4 005 M5 ... 3 N3 001 M1 002 M2 003 M3 004 M4 005 M5 ... 4 N4 5 N5 001 M1 002 M2 003 M3 004 M4 005 M5 ... 6 N6 ...
create table A(code int, name varchar(10), zt varchar(10))
insert into a values(1 , 'N1', ',0,')
insert into a values(2 , 'N2', ',0,4,')
insert into a values(3 , 'N3', ',0,4,')
insert into a values(4 , 'N4', ',0,')
insert into a values(5 , 'N5', ',0,4,')
insert into a values(6 , 'N6', ',0,')
create table b(dm varchar(10), mc varchar(10))
insert into b values('001', 'M1')
insert into b values('002', 'M2')
insert into b values('003', 'M3')
insert into b values('004', 'M4')
insert into b values('005', 'M5')
go
select code , dm , name , mc from
(
select code = '', b.dm , a.name , b.mc , a.code px from a , b where charindex(',4,' , zt) > 0
union all
select ltrim(a.code) , dm = '' , a.name , mc = '' , a.code px from a
) t
order by px , case when code <> '' then 1 else 2 end
drop table a , b
/*
code dm name mc
------------ ---------- ---------- ----------
1 N1
2 N2
001 N2 M1
002 N2 M2
003 N2 M3
004 N2 M4
005 N2 M5
3 N3
001 N3 M1
002 N3 M2
003 N3 M3
004 N3 M4
005 N3 M5
4 N4
5 N5
001 N5 M1
002 N5 M2
003 N5 M3
004 N5 M4
005 N5 M5
6 N6
(所影响的行数为 21 行)
*/
------解决方案--------------------
declare @count int,@rn int
declare @tb table (DM_NEW int,MC_NEW varchar(32))
select @count =COUNT(1) from a
set @rn =1
while @count >0
begin
insert into @tb select top(1) code,name from (select ROW_NUMBER() over(order by code )rn, code,name from a where rn=@rn)aa
if exists (select 1 from a where zt like '%4%'
begin
insert into @tb select id,name from b
end
set @count=@count-1
set @rn =@rn +1
end
------解决方案--------------------
create table A(code int, name varchar(10), zt varchar(10))
insert into a values(1 , 'N1', ',0,')
insert into a values(2 ,