求优化。。

wxylvmnn 2013-02-06 02:24:57
数据源:
 
SELECT * FROM Y
/*
B
001
002
003
*/
SELECT * FROM X
/*
A B
S0001 001
S0002 002
S0002 003
*/


现在,表X的数据不完整,
对于表X的 A字段的 每个值来说,都应该对应 表Y中的 数据的件数。
就说说,我想得到如下效果的数据。
 
SELECT * FROM X
/*
A B
S0001 001
S0001 002--需要insert进来
S0001 003--需要insert进来
S0002 001--需要insert进来
S0002 002
S0002 003
*/


我现在的实现方法很笨拙,是这样的。

INSERT INTO Y (A,b)

SELECT t1.A ,
t1.B
FROM ( SELECT Y1.A,
X.B
FROM ( SELECT DISTINCT
A AS A
FROM Y
) AS Y1,X
) t1
WHERE NOT EXISTS ( SELECT 1
FROM Y
WHERE t1.A=Y.A AND t1.B=Y.B)


求改善。请赐教
...全文
307 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxylvmnn 2013-02-07
  • 打赏
  • 举报
回复
TO:yy1987316 没太明白你的意思哈,能给个完整点的SQL语句么
yy1987316 2013-02-06
  • 打赏
  • 举报
回复
引用 14 楼 yy1987316 的回复:
SQL code?123456--A,B全连接select distinct X.A,Y.B into tbl --然后把tbl和Y表名换掉 --这样可以不用做集合操作
忘记写from了...
yy1987316 2013-02-06
  • 打赏
  • 举报
回复

--A,B全连接
select distinct X.A,Y.B into tbl

--然后把tbl和Y表名换掉

--这样可以不用做集合操作
wxylvmnn 2013-02-06
  • 打赏
  • 举报
回复
>要插入1qw的数据,不说查询,直接插入都会很久的 恩,是啊,直接插入会很慢, 我刚才把表还原了一下,然后把insert into去掉了, 执行了一下select操作,耗时2分钟左右。 我在想,我把这数据给bcp导出txt, 然后再bcp一次插入进来,速度会不会能快点?
wxylvmnn 2013-02-06
  • 打赏
  • 举报
回复
>既然是两列的迪卡尔,为什么不记下两列独一值,TRUNCATE表,再挂上新数据呢 因为,表Y的数据我不确定,用户说,很可能执行一次,只需要插入一条数据而已, 如果为了这一条数据而清空表,重新插入的话,不太好。所以最开始就放弃了truncate表的想法,只考虑把缺的数据给补上。
szm341 2013-02-06
  • 打赏
  • 举报
回复
要插入1qw的数据,不说查询,直接插入都会很久的
wxylvmnn 2013-02-06
  • 打赏
  • 举报
回复
现在,所有的字段都是主键,应该不差在这上。
wxylvmnn 2013-02-06
  • 打赏
  • 举报
回复
整体弄一下,貌似还是很慢啊, 临时表创建后,用临时表结合,即,把我的t1改成了#t, 执行插入10730648条数据,用时5分55秒。。。
Q315054403 2013-02-06
  • 打赏
  • 举报
回复
既然是两列的迪卡尔,为什么不记下两列独一值,TRUNCATE表,再挂上新数据呢
szm341 2013-02-06
  • 打赏
  • 举报
回复
select a.A,b.B into #t from (select distinct A from X)a,Y b create clustered index ix_#t_a_b_00001 on #t(a,b) insert into X(A,B) select t.a,t.b from #t t left join X t1 on t.a=t1.a and t.b=t1.b where b.a is null 最好X的a,b上有索引
wxylvmnn 2013-02-06
  • 打赏
  • 举报
回复
select a.A,b.B into #t from (select distinct A from X)a,Y b 速度很快,执行了5次,平均12秒左右。 临时表里插入了12593952条数据。
szm341 2013-02-06
  • 打赏
  • 举报
回复
千万级的啊,执行这个要多久? select a.A,b.B into #t from (select distinct A from X)a,Y b
htl258_Tony 2013-02-06
  • 打赏
  • 举报
回复
2000的用exists,子查询改临时表,其它的跟你的语句一样。 如果只有那两个列,没有主、外键,可以考虑 truncate table X,再查询插入,弃用exists.
wxylvmnn 2013-02-06
  • 打赏
  • 举报
回复
数据量的确很大,表Y是千万级的数据量。现在的执行,需要5分钟左右才能完事,有点挠头啊。。。
wxylvmnn 2013-02-06
  • 打赏
  • 举报
回复
忘了说了,我这是SQL2000哈。。。比较原始,不支持EXCEPT
htl258_Tony 2013-02-06
  • 打赏
  • 举报
回复
量大加个临时表试试:
SELECT DISTINCT A INTO #t FROM Y
INSERT INTO X (A,b) 
SELECT X.A,Y.B FROM X,#t Y
EXCEPT
SELECT A,B FROM X

34,590

社区成员

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

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