100分求一个SQL语句,在线等,谢谢大家了

sqllong 2006-06-05 08:26:38
现有同结构的表若干,例如

表t1:( func列的值有若干纪录)
func size times
---------- ----------- -----------
a 2 60
b 1 90
c 4 50
g 5 65
......

表t2:( func列的值有若干纪录)
func size times
---------- ---------- -----------
a 4 50
b 4 80
c 2 78
f 1 58
......

表t3:( func列的值有若干纪录)
func size times
---------- ---------- -----------
a 6 45
d 4 225
c 4 56
b 2 45
......

表t4,表t5........(至少有20多张该结构的表)
期望结果:
func t1-size t1-times t2-size t3-times t2-size t3-times ........
----- ------ ------- ------- ------- ------- -------

a 2 60 4 50 6 45
b 1 90 2 45 4 80
c 2 78 4 50 4 56
d NULL NULL NULL NULL 4 225
f NULL NULL 1 58 NULL NULL
g 5 65 NULL NULL NULL NULL
.......

大家帮帮忙,先谢了
请给出测试语句
(请注意:表不仅仅只有以上列举的3张表,各表的func字段下也不仅仅只有各表列举的值)
谢谢大家了


...全文
585 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangfushen 2006-06-06
  • 打赏
  • 举报
回复
Select IsNull(IsNull(A.func,B.func),C.func) As func,
A.size As [t1-size],
A.times As [t1-times],
B.size As [t2-size],
B.times As [t2-times],
C.size As [t3-size],
C.times As [t3-times]
From @t1 A
Full Join @t2 B On A.func=B.func
Full Join @t3 C On B.func=C.func
paoluo 2006-06-05
  • 打赏
  • 举报
回复
可以這樣


Select
A. func,
B.size As [t1-size],
B.times As [t1-times],
C.size As [t2-size],
C.times As [t2-times],
D.size As [t3-size],
D.times As [t3-times]
From
(Select func From t1
Union
Select func From t2
Union
Select func From t3) A
Left Join t1 B On A.func=B.func
Left Join t2 C On A.func=C.func
Left Join t3 D On A.func=D.func
昵称被占用了 2006-06-05
  • 打赏
  • 举报
回复
不要用full join
要不必须没增加一个表增加一个嵌套,写的自己都分不清是哪一层的了

paoluo 2006-06-05
  • 打赏
  • 举报
回复
最好采用的是Union All??

如果表名有規律的話,可以考慮用動態語句。

不然手寫出來的語句太長了。
sqllong 2006-06-05
  • 打赏
  • 举报
回复
谢谢大家了
问题基本解决了
sqllong 2006-06-05
  • 打赏
  • 举报
回复
上面格式乱了
重新发一个 5张表的


FUNC 1-size 1-time 2-size 2-time 3-size 3-time 4-size 4-time 5-size 5-time
---- -------------- ----------- -------- ----------- ----------- ----------- -----
a 2 60 4 50 6 45 45 54 45 455555
b 1 90 4 80 2 45 54 78 45 45
c 4 50 2 78 4 56 NULL NULL 15325 545345
d NULL NULL NULL NULL 4 225 56345 4545 NULL NULL
f NULL NULL 1 58 NULL NULL NULL NULL NULL NULL
g 5 65 NULL NULL NULL NULL NULL NULL 4863 7878
iii NULL NULL NULL NULL NULL NULL NULL NULL 483873 8378
iii NULL NULL NULL NULL NULL NULL 48 887 NULL NULL
iiii NULL NULL NULL NULL NULL NULL NULL NULL 45354 45345
itblog 2006-06-05
  • 打赏
  • 举报
回复
SELECT
COALESCE(A.FUNC, B.FUNC, C.FUNC) AS FUNC,
max(A.[SIZE]), max(A.TIMES),
max(B.[SIZE]), max(B.TIMES),
max(C.[SIZE]), max(C.TIMES)
FROM
group by a.func,b.func,c.func....
ORDER BY FUNC


加聚合函数,用group by,上面用的是max,你也可以用min和sum
sqllong 2006-06-05
  • 打赏
  • 举报
回复
谢谢大家

Reeezak(坚持信念) ( ) 信誉:100

但有点问题还想请教下
在表多的时候,连接会出现一下情况,应该怎么解决呢
FUNC SIZE TIMES SIZE TIMES SIZE TIMES SIZE TIMES SIZE TIMES
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
a 2 60 4 50 6 45 45 54 45 455555
b 1 90 4 80 2 45 54 78 45 45
c 4 50 2 78 4 56 NULL NULL 15325 545345
d NULL NULL NULL NULL 4 225 NULL NULL NULL NULL
d NULL NULL NULL NULL NULL NULL 56345 4545 NULL NULL
f NULL NULL 1 58 NULL NULL NULL NULL NULL NULL
g 5 65 NULL NULL NULL NULL NULL NULL 4863 7878
iii NULL NULL NULL NULL NULL NULL 48 887 NULL NULL
iii NULL NULL NULL NULL NULL NULL NULL NULL 483873 8378
iiii NULL NULL NULL NULL NULL NULL NULL NULL 45354 45345

(所影响的行数为 10 行)
Reeezak 2006-06-05
  • 打赏
  • 举报
回复
为什么大家都喜欢嵌套一堆ISNULL?
COALESCE用在这个地方不是更加简洁明了吗?
昵称被占用了 2006-06-05
  • 打赏
  • 举报
回复
paoluo(一天到晚游泳的鱼)
一样的
还是那个例子,重复1
paoluo 2006-06-05
  • 打赏
  • 举报
回复
Reeezak(坚持信念)的COALESCE這個函數用的好,以前還沒用過。

COALESCE
傳回在其引數中第一個非 NULL 的運算式。

語法
COALESCE ( expression [ ,...n ] )

昵称被占用了 2006-06-05
  • 打赏
  • 举报
回复
200*20=4000

测试下先吧

paoluo 2006-06-05
  • 打赏
  • 举报
回复
這樣呢??

Select
IsNull(IsNull(A.func,B.func),C.func) As func,
A.size As [t1-size],
A.times As [t1-times],
B.size As [t2-size],
B.times As [t2-times],
C.size As [t3-size],
C.times As [t3-times]
From @t1 A
Full Join @t2 B On A.func=B.func
Full Join @t3 C On B.func=C.func
昵称被占用了 2006-06-05
  • 打赏
  • 举报
回复
测试一下:
有两个3,原因就是full join没用子查询


select isnull(isnull(t1.a,t2.b),t3.c) from (
select 1 as a
union all
select 2 as a
) as t1 full join (
select 2 as b
union all
select 3 as b
) as t2
on t1.a=t2.b
full join (
select 1 as c
union all
select 3 as c
) as t3
on t1.a=t3.c

sqllong 2006-06-05
  • 打赏
  • 举报
回复
先谢谢大家了
表20多张的确不算多,但每张表func的列有将近200多条纪录......
以上大家的方案或多或少都有写不足,继续期待大家的关注,问题解决,立马散分~~~~~~~~~~~
昵称被占用了 2006-06-05
  • 打赏
  • 举报
回复
paoluo(一天到晚游泳的鱼) ( ) 信誉:100 2006-06-05 08:38:00 得分: 0


大量子查詢?????用了大量Union效率也會有影響的。



Select
IsNull(IsNull(A.func,B.func),C.func) As func,
A.size As [t1-size],
A.times As [t1-times],
B.size As [t2-size],
B.times As [t2-times],
C.size As [t3-size],
C.times As [t3-times]
From t1 A
Full Join t2 B On A.func=B.func
Full Join t3 C On A.func=C.func


这个是错误的,结果不对,因为你都和T1连接,t2 t3有而t1没有的记录就有问题

laoliu666 2006-06-05
  • 打赏
  • 举报
回复
用构造列
十一月猪 2006-06-05
  • 打赏
  • 举报
回复
同意鱼兄
20多个表
不过也太长了
laoliu666 2006-06-05
  • 打赏
  • 举报
回复
Create table test1(func nvarchar(10),size int,times int)
insert test1 select 'a',2,60
union select 'b',1,90
union select 'c',4,50
union select 'g',5,65

Create table test2(func nvarchar(10),size int,times int)
insert test2 select 'a',4,50
union select 'b',4,80
union select 'c',2,78
union select 'g',1,58

----比较结果
select * from test2

select * from test1
select *,(select size from test2 b where a.func =b.func) as size1,
(select times from test2 b where a.func=b.func) as times1
from test1 a
撸大湿 2006-06-05
  • 打赏
  • 举报
回复
同意完美动物
加载更多回复(6)
谢谢大家的支持,我会陆续上传相关电子书 由于体积较大,本书分两卷压缩,请都下载完再解压! Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一) http://download.csdn.net/source/3268267 Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二) http://download.csdn.net/source/3268312 内容简介   本书是专门为oracle应用开发人员提供的sql和pl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)。   除了为读者提供编写sql语句和开发pl/sql块的方法外,本书还为应用开发人员提供了一些常用的pl/sql系统包。通过使用这些pl/sql系统包,应用开发人员可以开发出功能更强大的数据库应用程序。本书不仅适合sql和pl/sql初学者,也适合于有经验的oracle应用开发人员。 前言 第一部分 sql和pl/sql相关工具  第1章 在windows 平台上安装oracle database 11g  第2章 配置网络服务名  第3章 使用sql database  第4章 使用sql*plus 第二部分 sql  第5章 sql和pl/sql综述  第6章 简单查询  第7章 sql单行函数  第8章 操纵数据  第9章 复杂查询  第10章 管理常用对象 第三部分 pl/sql  第11章 pl/sql基础  第12章 访问oracle  第13章 编写控制结构  第14章 使用复合数据类型  第15章 使用游标  第16章 异常处理 . 第17章 本地动态sql  第18章 pl/sql过程  第19章 pl/sql函数  第20章 pl/sql包  第21章 触发器  第22章 使用对象类型 第四部分 pl/sql系统包  第23章 使用大对象  第24章 读写os文件  第25章 开发多媒体应用  第26章 开发web应用  第27章 dbms_sq动态sql  第28章 管理统计  第29章 使用数据库资源管理器  第30章 数据加密和解密  第31章 使用调度程序  第32章 使用flashback  第33章 使用重定义联机表  第34章 修正损坏块  第35章 使用日里民挖掘  第36章 使用管道  第37章 使用精细访问控制  第38章 使用精细审计  第39章 使用预警事件  第40章 转换rowid  第41章 其他常用包 习题答案
谢谢大家的支持,我会陆续上传相关电子书 由于体积较大,本书分两卷压缩,请都下载完再解压! Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一) http://download.csdn.net/source/3268267 Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二) http://download.csdn.net/source/3268312 内容简介   本书是专门为oracle应用开发人员提供的sql和pl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)。   除了为读者提供编写sql语句和开发pl/sql块的方法外,本书还为应用开发人员提供了一些常用的pl/sql系统包。通过使用这些pl/sql系统包,应用开发人员可以开发出功能更强大的数据库应用程序。本书不仅适合sql和pl/sql初学者,也适合于有经验的oracle应用开发人员。 前言 第一部分 sql和pl/sql相关工具  第1章 在windows 平台上安装oracle database 11g  第2章 配置网络服务名  第3章 使用sql database  第4章 使用sql*plus 第二部分 sql  第5章 sql和pl/sql综述  第6章 简单查询  第7章 sql单行函数  第8章 操纵数据  第9章 复杂查询  第10章 管理常用对象 第三部分 pl/sql  第11章 pl/sql基础  第12章 访问oracle  第13章 编写控制结构  第14章 使用复合数据类型  第15章 使用游标  第16章 异常处理 . 第17章 本地动态sql  第18章 pl/sql过程  第19章 pl/sql函数  第20章 pl/sql包  第21章 触发器  第22章 使用对象类型 第四部分 pl/sql系统包  第23章 使用大对象  第24章 读写os文件  第25章 开发多媒体应用  第26章 开发web应用  第27章 dbms_sq动态sql  第28章 管理统计  第29章 使用数据库资源管理器  第30章 数据加密和解密  第31章 使用调度程序  第32章 使用flashback  第33章 使用重定义联机表  第34章 修正损坏块  第35章 使用日里民挖掘  第36章 使用管道  第37章 使用精细访问控制  第38章 使用精细审计  第39章 使用预警事件  第40章 转换rowid  第41章 其他常用包 习题答案

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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