求一条SQL语句

xiaowangtian1117 2006-12-19 05:01:36
表1:
名称
A
B
表2:
名称 数量
A 1
A 2
结果:
名称 数量
A 3
B 0
求速度最快的一条SQL语句?
...全文
258 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaowangtian1117 2006-12-21
  • 打赏
  • 举报
回复
up
bluedl 2006-12-21
  • 打赏
  • 举报
回复
自动生成1000000条数据测试了下,结果如下

Left join方法 3秒左右

****************
select 名称 ,sum(数量) 数量 from 表2 group by 名称
union all
select 名称,0 数量 from 表1 where not exists(select * from 表2 where 名称=表1.名称 )

2秒左右
****************

****************
select A.名称, 数量=isnull( (select sum(数量) from B where 名称=A.名称), 0) from A

SELECT
(SELECT 表1.NAME FROM 表1 WHERE 表1.ID = 表2.ID) AS NAME,
SUM(DATA) AS DATA
FROM
表2
GROUP BY 表2.ID

1秒左右
****************
marco08 2006-12-20
  • 打赏
  • 举报
回复
都差不多, 你可以放到一個事務中執行,再看一下執行計劃
xiaowangtian1117 2006-12-20
  • 打赏
  • 举报
回复
表2中数据量在百万的情况下哪种更快?
yuedeem 2006-12-20
  • 打赏
  • 举报
回复
学习~
zsl5305256 2006-12-20
  • 打赏
  • 举报
回复
select A.名称, 数量=isnull( (select sum(数量) from B where 名称=A.名称), 0) from A
wjgwrn 2006-12-20
  • 打赏
  • 举报
回复
select 名称 ,sum(数量) 数量 from 表2 group by 名称
union all
select 名称,0 数量 from 表1 where not exists(select * from 表2 where 名称=表1.名称 )


bluedl 2006-12-20
  • 打赏
  • 举报
回复
楼主看这个行不,没有大量数据环境

SELECT
(SELECT 表1.NAME FROM 表1 WHERE 表1.ID = 表2.ID) AS NAME,
SUM(DATA) AS DATA
FROM
表2
GROUP BY 表2.ID
InFerNaL_LioN 2006-12-20
  • 打赏
  • 举报
回复
select 表1.名称,sum(isnull(表二.数量,0))
from 表1 left join 表2
on 表1.id=表2.id
group by 表1.id
xiaowangtian1117 2006-12-20
  • 打赏
  • 举报
回复
有没有更好的解决方案,在大数据量的环境中。
xiaowangtian1117 2006-12-20
  • 打赏
  • 举报
回复
用left join在大数据量下会比较慢吧?
子陌红尘 2006-12-20
  • 打赏
  • 举报
回复
select a.名称,sum(b.数量) from 表1 a left join 表2 b on a.名称=b.名称 group by a.名称
xiaowangtian1117 2006-12-20
  • 打赏
  • 举报
回复
我原来方法是对表1用游标遍历对表2进行查询,速度比你的慢,但是当表2的数据量很大时,两者的速度差异就不是很明显了。这是为什么?
marco08 2006-12-19
  • 打赏
  • 举报
回复
create table A(名称 char(1))
insert A select 'A'
insert A select 'B'

create table B(名称 char(1), 数量 int)
insert B select 'A',1
insert B select 'A',2
--方法一
select A.名称, isnull(B.数量, 0) as 数量 from A
left join (select 名称, sum(数量) as 数量 from B group by 名称) as B
on A.名称=B.名称
--方法二
select A.名称, 数量=isnull( (select sum(数量) from B where 名称=A.名称), 0) from A

--result
名称 数量
---- -----------
A 3
B 0

(2 row(s) affected)
marco08 2006-12-19
  • 打赏
  • 举报
回复
select A.名称, isnull(B.数量, 0) as 数量
from A
left join
(select 名称, sum(数量) as 数量 from B group by 名称) as B
on A.名称=B.名称

34,590

社区成员

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

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