一个比较另类的sql查询求解!
我有两个表 table1,table2
结构是
table1
CREATE TABLE [dbo].[TABLE1] (
[n] [int] IDENTITY (1, 1) NOT NULL ,
[a] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[b] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[d] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[e] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
table2 结构
CREATE TABLE [dbo].[TABLE2] (
[n] [int] IDENTITY (1, 1) NOT NULL ,
[a] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[b] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[o] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[p] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
数据库表内容
table1
a b d e
------------------------
a b 45 58
a b 26 48
a b 15 23
aa bb 25 26
table2
a b o p
----------------------------
a b df ss
a b se lp
aa bb dr ger
aa bb der df
现在我需要一个结果 结构内容是
a b d e o p
---------------------------------
a b 45 58 df ss
a b 26 48 se lp
a b 15 23
aa bb 25 26 dr ger
aa bb der df
---------------------------
也就是说,取a,b,两个公共自段,d,e,o,p 四个差异自段,组合一个新的结构,同时内容要求,是两个表内容的最小,如上,table1中,a=a,b=b的有三条记录,而table2中有两条记录,那么拼凑三条记录,table2中缺失的用空值代替。table1中a=aa,b=bb的有一条记录,table2中有两条,结果中就拼凑三条记录,table1中不够的就用空值代替。
你看明白了吗?谢谢你的参与
问题点数:20、回复次数:6Top
1 楼CSDMN(冒牌经理 V0.4)回复于 2004-08-02 17:49:26 得分 20
不是有id字段n吗?
select
isnull(a.a,b.a) as a,
isnull(a.b,b.b) as b,
a.d,a.e,b.o,b.p
from table1 a full join table2 b
on a.a=b.a
and a.b.b.b
and (select count(*) from table1 where a=a.a and b=a.b and n<=a.n)=(select count(*) from table2 where a=b.a and b=b.b and n<=b.n)
Top
2 楼CSDMN(冒牌经理 V0.4)回复于 2004-08-02 17:55:50 得分 0
有点错误,修改和测试:
--建立环境
CREATE TABLE [dbo].[TABLE1] (
[n] [int] IDENTITY (1, 1) NOT NULL ,
[a] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[b] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[d] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[e] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL
)
go
CREATE TABLE [dbo].[TABLE2] (
[n] [int] IDENTITY (1, 1) NOT NULL ,
[a] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[b] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[o] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[p] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
)
go
insert table1( a, b, d, e)
select
'a', 'b', '45', '58'
union all select
'a' , 'b' , '26' , '48'
union all select
'a' , 'b' , '15' , '23'
union all select
'aa' , 'bb' , '25' , '26'
go
insert table2 ( a , b , o , p )
select
'a', 'b', 'df', 'ss'
union all select
'a' , 'b' , 'se' , 'lp'
union all select
'aa' , 'bb' , 'dr' , 'ger'
union all select
'aa' , 'bb' , 'der' , 'df'
go
--查询
select
isnull(a.a,b.a) as a,
isnull(a.b,b.b) as b,
a.d,a.e,b.o,b.p
from table1 a full join table2 b
on a.a=b.a
and a.b=b.b
and (select count(*) from table1 where a=a.a and b=a.b and n<=a.n)=(select count(*) from table2 where a=b.a and b=b.b and n<=b.n)
--结果
/*
a b d e o p
---------- ---------- ---------- ---------- ---------- ----------
a b 45 58 df ss
a b 26 48 se lp
a b 15 23 NULL NULL
aa bb 25 26 dr ger
aa bb NULL NULL der df
(所影响的行数为 5 行)
*/
Top
3 楼jfq3d(秦时明月)回复于 2004-08-03 10:29:28 得分 0
谢谢楼上的回答,昨天我看了一半,社区竟然登录不上了,别的版面都能上!怪怪,你们也是这样吗?
不过,我提供的两个表结构有自动编号n主键,实际上这两个是查询出来的(select 来的 ),所以没有n的信息。如果这个样子不知怎么解决?Top
4 楼CSDMN(冒牌经理 V0.4)回复于 2004-08-03 11:51:55 得分 0
用临时表,产生序号,反正这个问题没有序号就必须用游标一个一个拼凑,速度更成问题
Top
5 楼CSDMN(冒牌经理 V0.4)回复于 2004-08-03 11:52:54 得分 0
你的表结构有
[n] [int] IDENTITY (1, 1) NOT NULL ,
不象自己写的,怎么说没有?
Top
6 楼jfq3d(秦时明月)回复于 2004-08-03 16:21:51 得分 0
呵呵,是我特意建立的表结构,然后复制到这里,为的是大家回答测试方便。因为我知道热心人会自己创建结构测试一下,所以我就先创建了Top




