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字段下也不仅仅只有各表列举的值)
谢谢大家了


...全文
581 26 打赏 收藏 转发到动态 举报
写回复
用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)

34,587

社区成员

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

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