多表连接的疑问

dstmt 2008-10-27 09:41:53
表1:
id no 数学1 语文
1 1 100 90
---------------------------------------
表2:
id no 数学2 语文
1 2 85 70
----------------------------------------
表3:
id no 数学3 语文3
1 3 92 60

--------------------------------------------
需要把这三张表连接成一张表
结果:
id no 数学1 数学2 数学3 语文 语文3
1 1 100 null null 90 null
1 2 null 85 null 70 null
1 3 null null 92 null 60

--------------------------------------------------------------
三个表中的数据都是百万级别的,如何较高效率的得出结果

请教一下,谢谢大家
...全文
104 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rucypli 2008-10-27
  • 打赏
  • 举报
回复
sysobjects,syscolumns?
dstmt 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 szx1999 的回复:]
引用 9 楼 dstmt 的回复:
大家竟然都是看着表中数据写sql文,怪我没表述清楚,
我想表达的意思是把三张表的列给统计出来,列名相同的合并

那只能用动态语句了,对于大数据量,这种想法不切实际。
还是手动一列列的写吧。
[/Quote]
列名是动态的,所以不好写
wzy_love_sly 2008-10-27
  • 打赏
  • 举报
回复
靠,还以为楼主写错列名了呢....
等不到来世 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dstmt 的回复:]
大家竟然都是看着表中数据写sql文,怪我没表述清楚,
我想表达的意思是把三张表的列给统计出来,列名相同的合并
[/Quote]
那只能用动态语句了,对于大数据量,这种想法不切实际。
还是手动一列列的写吧。
dstmt 2008-10-27
  • 打赏
  • 举报
回复
大家竟然都是看着表中数据写sql文,怪我没表述清楚,
我想表达的意思是把三张表的列给统计出来,列名相同的合并
等不到来世 2008-10-27
  • 打赏
  • 举报
回复
select id=coalesce(a.id,b.id,c.id),no=coalesce(a.no,b.no,c.no),a.数学1,b.数学2,c.数学3,[语文]=coalesce(a.语文,b.语文),c.语文3 
from 表1 a full join 表2 b on a.id=b.id and a.no=b.no
full join 表3 c on c.id=b.id and c.no=b.no
/*
id no 数学1 数学2 数学3 语文 语文3
----------- ----------- ----------- ----------- ----------- ----------- -----------
1 1 100 NULL NULL 90 NULL
1 2 NULL 85 NULL 70 NULL
1 3 NULL NULL 92 NULL 60

(3 row(s) affected)
*/

睡觉了……
等不到来世 2008-10-27
  • 打赏
  • 举报
回复
create table 表1(id int,no int,数学1 int,语文 int)
create table 表2(id int,no int,数学2 int,语文 int)
create table 表3(id int,no int,数学3 int,语文3 int)
insert 表1 select 1,1,100,90
insert 表2 select 1,2,85,70
insert 表3 select 1,3,92,60

select id=coalesce(a.id,b.id,c.id),no=coalesce(a.no,b.no,c.no),a.数学1,b.数学2,c.数学3,coalesce(a.语文,b.语文),c.语文3
from 表1 a full join 表2 b on a.id=b.id and a.no=b.no
full join 表3 c on c.id=b.id and c.no=b.no
/*
id no 数学1 数学2 数学3 语文3
----------- ----------- ----------- ----------- ----------- ----------- -----------
1 1 100 NULL NULL 90 NULL
1 2 NULL 85 NULL 70 NULL
1 3 NULL NULL 92 NULL 60

(3 row(s) affected)
*/
dstmt 2008-10-27
  • 打赏
  • 举报
回复
楼上的,无语了,幽默
水族杰纶 2008-10-27
  • 打赏
  • 举报
回复
union all
wzy_love_sly 2008-10-27
  • 打赏
  • 举报
回复
/*
id no 数学1 数学2 数学3 语文1 语文2 语文3
1 1 100 NULL NULL 90 NULL NULL
1 2 NULL 85 NULL NULL 70 NULL
1 3 NULL NULL 92 NULL NULL 60
*/
wzy_love_sly 2008-10-27
  • 打赏
  • 举报
回复
create table t1(id int,no int,数学1 int,语文1 int)
insert into t1 select 1,1,100,90

create table t2(id int,no int,数学2 int,语文2 int)
insert into t2 select 1,2,85,70

create table t3(id int,no int,数学3 int,语文3 int)
insert into t3 select 1,3,92,60
go
select id,no,数学1,null as 数学2,null as 数学3, 语文1,null as 语文2, null as 语文3 from t1
union all
select id,no,null as 数学1,数学2,null as 数学3, null as 语文1,语文2, null as 语文3 from t2
union all
select id,no,null as 数学1,null as 数学2,数学3, null as 语文1,null as 语文2, 语文3 from t3


/*
id no 数学1 数学2 数学3 语文1 语文2 语文3
1 1 100 NULL NULL 90 NULL NULL
1 2 NULL 85 NULL NULL 70 NULL
1 3 NULL NULL 92 NULL NULL 60
*/
Mr-Jee 2008-10-27
  • 打赏
  • 举报
回复

insert into Table select id,no,数学1,null,null,语文,null from 表1;
insert into Table select id,no,null,数学2,null,语文,null from 表2;
insert into Table select id,no,null,null,数学3,null,语文3 from 表3;

感觉这样写也不会太慢吧!
CN_SQL 2008-10-27
  • 打赏
  • 举报
回复

declare @t1 table
(
id int,
[no] int,
数学1 int,
语文 int
)
declare @t2 table
(
id int,
[no] int,
数学2 int,
语文 int
)
declare @t3 table
(
id int,
[no] int,
数学3 int,
语文3 int
)

insert @t1 select 1,1,100,90
insert @t2 select 1,2,85,70
insert @t3 select 1,3,92,60

select
id,[no],数学1,NULL as 数学2,NULL as 数学3,语文,NULL as 语文3
from @t1
union all
select
id,[no],NULL as 数学1,数学2,NULL as 数学3,语文,NULL as 语文3
from @t2
union all
select
id,[no], NULL as 数学1,NULL as 数学2,数学3,NULL as 语文,语文3
from @t3

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧