a 表 b表
id code id code
a1 mm1 a1 mm3
a1 mm2 a1 mm4
a2 kk1 a1 mm5
a3 nn1 a1 mm6
a3 nn2 a2 kk2
a3 nn3 a3 nn6
a3 nn4 a3 nn7
a3 nn5 a3 nn8
...... ......想要得出以下结果:id codea codeb
a1 mm1 mm3
mm2 mm4
mm5
mm6
a2 kk1 kk2
a3 nn1 nn6
nn2 nn7
nn3 nn8
nn4
nn5
......
可有什么方法实现?
id code id code
a1 mm1 a1 mm3
a1 mm2 a1 mm4
a2 kk1 a1 mm5
a3 nn1 a1 mm6
a3 nn2 a2 kk2
a3 nn3 a3 nn6
a3 nn4 a3 nn7
a3 nn5 a3 nn8
...... ......想要得出以下结果:id codea codeb
a1 mm1 mm3
mm2 mm4
mm5
mm6
a2 kk1 kk2
a3 nn1 nn6
nn2 nn7
nn3 nn8
nn4
nn5
......
可有什么方法实现?
解决方案 »
- 字符串处理
- 一个超级简单的SQL安装问题
- 急需解决:sql2005连接不了服务器啊
- 小女初次来这,请教一个简单的问题,希望大哥哥能解答!
- 求个存储过程~~~~~
- 数据导入导出问题----“连接占线导致另外一个命令”
- sql05里,执行一个过程,总是提示:必须声明标量变量 "@cid"。如何解决???新手求助!
- 一个有关主键的奇怪的问题
- 奇怪问题,求助
- win2000下建立ODBC数据源,连接SQLSERVER2000出现问题!
- 如何用 dataset 获得存储过程输出的参数
- select * from sysobjects where type='p'有存储过程,但是在用到这个sp的时候却说不存在的问题!
select
isnull(m.id,n.id) as id,
m.code as codea,
n.code as codeb
from
(select t.*,(select count(1) from a where id=t.id and code<=t.code) as num from a t) m
full outer join
(select t.*,(select count(1) from b where id=t.id and code<=t.code) as num from b t) n
on
m.id=n.id and m.num=n.num
order by
isnull(m.id,n.id),isnull(m.num,n.num)
declare @a table(id varchar(8),code varchar(8))
insert into @a select 'a1','mm1'
insert into @a select 'a1','mm2'
insert into @a select 'a2','kk1'
insert into @a select 'a3','nn1'
insert into @a select 'a3','nn2'
insert into @a select 'a3','nn3'
insert into @a select 'a3','nn4'
insert into @a select 'a3','nn5'declare @b table(id varchar(8),code varchar(8))
insert into @b select 'a1','mm3'
insert into @b select 'a1','mm4'
insert into @b select 'a1','mm5'
insert into @b select 'a1','mm6'
insert into @b select 'a2','kk2'
insert into @b select 'a3','nn6'
insert into @b select 'a3','nn7'
insert into @b select 'a3','nn8'
select
isnull(m.id,n.id) as id,
m.code as codea,
n.code as codeb
from
(select t.*,(select count(1) from @a where id=t.id and code<=t.code) as num from @a t) m
full outer join
(select t.*,(select count(1) from @b where id=t.id and code<=t.code) as num from @b t) n
on
m.id=n.id and m.num=n.num
order by
isnull(m.id,n.id),isnull(m.num,n.num)
/*
id codea codeb
-------- -------- --------
a1 mm1 mm3
a1 mm2 mm4
a1 NULL mm5
a1 NULL mm6
a2 kk1 kk2
a3 nn1 nn6
a3 nn2 nn7
a3 nn3 nn8
a3 nn4 NULL
a3 nn5 NULL
*/
INSERT @TA
SELECT 'a1', 'mm1' UNION ALL
SELECT 'a1', 'mm2' UNION ALL
SELECT 'a2', 'kk1' UNION ALL
SELECT 'a3', 'nn1' UNION ALL
SELECT 'a3', 'nn2' UNION ALL
SELECT 'a3', 'nn3' UNION ALL
SELECT 'a3', 'nn4' UNION ALL
SELECT 'a3', 'nn5'
DECLARE @TB TABLE(id VARCHAR(2), code VARCHAR(5), ID2 INT IDENTITY(1,1))
INSERT @TB
SELECT 'a1', 'mm3' UNION ALL
SELECT 'a1', 'mm4' UNION ALL
SELECT 'a1', 'mm5' UNION ALL
SELECT 'a1', 'mm6' UNION ALL
SELECT 'a2', 'kk2' UNION ALL
SELECT 'a3', 'nn6' UNION ALL
SELECT 'a3', 'nn7' UNION ALL
SELECT 'a3', 'nn8'SELECT CASE WHEN ISNULL(A.SEQ,B.SEQ)=1 THEN ISNULL(A.ID,'') ELSE '' END AS ID,ISNULL(A.CODE,'') AS CODEA,ISNULL(B.CODE,'') AS CODEB
FROM (
SELECT *,SEQ=ID2-(SELECT COUNT(*) FROM @TA WHERE ID<A.ID) FROM @TA AS A) A
FULL JOIN (
SELECT *,SEQ=ID2-(SELECT COUNT(*) FROM @TB WHERE ID<A.ID) FROM @TB AS A) B ON A.ID=B.ID AND A.SEQ=B.SEQ
/*
ID CODEA CODEB
---- ----- -----
a1 mm1 mm3
mm2 mm4
mm5
mm6
a2 kk1 kk2
a3 nn1 nn6
nn2 nn7
nn3 nn8
nn5
nn4 (10 row(s) affected)
*/
IF OBJECT_ID('TEMPDB..#')IS NOT NULL DROP TABLE #
GO
declare @a table(id varchar(8),code varchar(8))
insert into @a select 'a1','mm1'
insert into @a select 'a1','mm2'
insert into @a select 'a2','kk1'
insert into @a select 'a3','nn1'
insert into @a select 'a3','nn2'
insert into @a select 'a3','nn3'
insert into @a select 'a3','nn4'
insert into @a select 'a3','nn5'
declare @b table(id varchar(8),code varchar(8))
insert into @b select 'a1','mm3'
insert into @b select 'a1','mm4'
insert into @b select 'a1','mm5'
insert into @b select 'a1','mm6'
insert into @b select 'a2','kk2'
insert into @b select 'a3','nn6'
insert into @b select 'a3','nn7'
insert into @b select 'a3','nn8'
select
isnull(m.id,n.id) as id,
m.code as codea,
n.code as codeb,
CNT=IDENTITY(INT,1,1) INTO #
from
(select t.*,(select count(1) from @a where id=t.id and code<=t.code) as num from @a t) m
full outer join
(select t.*,(select count(1) from @b where id=t.id and code<=t.code) as num from @b t) n
on
m.id=n.id and m.num=n.num
order by
isnull(m.id,n.id),isnull(m.num,n.num)
SELECT ID=CASE WHEN EXISTS(SELECT 1 FROM # WHERE ID=T.ID AND CNT<T.CNT ) THEN '' ELSE ID END,
CODEA,CODEB
FROM # T
/*ID CODEA CODEB
-------- -------- --------
a1 mm1 mm3
mm2 mm4
NULL mm5
NULL mm6
a2 kk1 kk2
a3 nn1 nn6
nn2 nn7
nn3 nn8
nn4 NULL
nn5 NULL*/
declare @a table(id varchar(8),code varchar(8))
insert into @a select 'a1','mm1'
insert into @a select 'a1','mm2'
insert into @a select 'a2','kk1'
insert into @a select 'a3','nn1'
insert into @a select 'a3','nn2'
insert into @a select 'a3','nn3'
insert into @a select 'a3','nn4'
insert into @a select 'a3','nn5'declare @b table(id varchar(8),code varchar(8))
insert into @b select 'a1','mm3'
insert into @b select 'a1','mm4'
insert into @b select 'a1','mm5'
insert into @b select 'a1','mm6'
insert into @b select 'a2','kk2'
insert into @b select 'a3','nn6'
insert into @b select 'a3','nn7'
insert into @b select 'a3','nn8'
select
(case when isnull(m.num,n.num)=1 then isnull(m.id,n.id) else '' end) as id,
isnull(m.code,'') as codea,
isnull(n.code,'') as codeb
from
(select t.*,(select count(1) from @a where id=t.id and code<=t.code) as num from @a t) m
full outer join
(select t.*,(select count(1) from @b where id=t.id and code<=t.code) as num from @b t) n
on
m.id=n.id and m.num=n.num
order by
isnull(m.id,n.id),isnull(m.num,n.num)
/*
id codea codeb
-------- -------- --------
a1 mm1 mm3
mm2 mm4
mm5
mm6
a2 kk1 kk2
a3 nn1 nn6
nn2 nn7
nn3 nn8
nn4
nn5
*/