求教:查询时间慢的问题!

不可触碰 2007-07-06 11:01:25
需求:把B表的数据插入A中,AB表结构一样。
为防止B重复插入A,我以下面的SQL作判断条件:
select * from B where id in
(
select a1.id from A a1,B b1
where a1.name+ a1.time= b1.name+ b1.time //注:以名字和时间来确定唯一
)

问题是当然表中有30000行数据时,执行很慢,加了索引也20分钟。
本人接触数据,请指点,是不是我的思路有问题?
...全文
242 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lt1129 2007-07-06
  • 打赏
  • 举报
回复
if exists
(
select 1 from A a1
inner join B b1
on a1.[name]=b1.[name] and a1.[time]=b1.[time]
)
paoluo 2007-07-06
  • 打赏
  • 举报
回复
如果是要往A中插入數據,做判斷,應該是我們開始寫的那個。

如果是要查詢,就用你後來寫的那個。

不過關聯條件那,還是改下好。
hellowork 2007-07-06
  • 打赏
  • 举报
回复
paoluo:
感觉楼主是要检测B表中的数据是否已经存在于A表中了,我的第一个回复和你的回复都是检测B表中是否存在还没有插入到A表中的数据.
paoluo 2007-07-06
  • 打赏
  • 举报
回复
hellowork(一两清风),怎麼改成inner join了?

另外,on a1.name+ a1.time= b1.name+ b1.time,最好改為A.name = B.name And A.[time] = B.[time]
paoluo 2007-07-06
  • 打赏
  • 举报
回复
If Exists(Select B.id From B Left Join A On A.name = B.name And A.[time] = B.[time] Where A.id Is Null)
hellowork 2007-07-06
  • 打赏
  • 举报
回复
抱歉,更正一下,没看清要求:
IF EXISTS(
SELECT 1 FROM B as b1
INNER JOIN A AS a1 on a1.name+ a1.time= b1.name+ b1.time
)
hellowork 2007-07-06
  • 打赏
  • 举报
回复
if exists(SELECT b.* FROM B as b1
LEFT JOIN A AS a1 on a1.name+ a1.time= b1.name+ b1.time
WHERE a1.id IS NULL)
不可触碰 2007-07-06
  • 打赏
  • 举报
回复
TO:hellowork(一两清风)
试过了,会多出很多记录,也许a1.name = b1.name and a1.time= b1.time这条件不能确定唯一,
谢谢各位,我把贴结了
hellowork 2007-07-06
  • 打赏
  • 举报
回复
或者:
SELECT * FROM B as b1
INNER JOIN A AS a1 on a1.name = b1.name and a1.time= b1.time
hellowork 2007-07-06
  • 打赏
  • 举报
回复
请指教,应该怎么用呢?
还有个问题,为什么会多出数据?
select * from B where id in
(
select a1.id from A a1,B b1
where a1.name+ a1.time= b1.name+ b1.time )
这样的话就不多,但速度实在不敢恭维
------------------------------------------------------------------------------
楼主的这个代码是在求B表中有哪些已经插入到了A表中,如果是这样的话就用我在二楼的回复试试:
SELECT * FROM B as b1
INNER JOIN A AS a1 on a1.name+ a1.time= b1.name+ b1.time
hellowork 2007-07-06
  • 打赏
  • 举报
回复
2.判断是否A表中有数据B表中没有的数据
IF EXISTS(
select 1 from B as b1
RIGHT join A as a1
on b1.name = a1.name and b1.time = a1.time
where b1.name is null)
------------------------------------------------------------------------------
和下面的是等价的:
IF EXISTS(
select 1 from A as a1
LEFT join B as b1
on b1.name = a1.name and b1.time = a1.time
where b1.name is null)
mkqiang 2007-07-06
  • 打赏
  • 举报
回复
关注
SoftwKLC 2007-07-06
  • 打赏
  • 举报
回复
楼主你Left join A as a1 ...加上一个and where b1.name is null ---结果肯定一行数据都没有,因为这样只存在a1.name is null的值
除非你是Right join A a1...加上一个and where b1.name is null 如果存在数据那么象
TO:hellowork(一两清风) 老大所说的 A表中存在B表中没有的数据

不可触碰 2007-07-06
  • 打赏
  • 举报
回复
请指教,应该怎么用呢?
还有个问题,为什么会多出数据?
select * from B where id in
(
select a1.id from A a1,B b1
where a1.name+ a1.time= b1.name+ b1.time )
这样的话就不多,但速度实在不敢恭维
hellowork 2007-07-06
  • 打赏
  • 举报
回复
呵呵,不是象楼主这样用的,请仔细看"2.判断是否A表中有数据B表中没有的数据
",用的是RIGHT右连接,不是LEFT左连接.
不可触碰 2007-07-06
  • 打赏
  • 举报
回复
TO:hellowork(一两清风)
执行
select 1 from B as b1
left join A as a1
on b1.name = a1.name and b1.time = a1.time
有31114条数据行
实际B表中18000

加上where b1.name is null后一行数据都没有了
hellowork 2007-07-06
  • 打赏
  • 举报
回复
还是没有理解楼主的准确意图.这样吧:
当从B表向A表插入数据时,根据判断重复的依据:

1.判断是否B表中仍有数据未插入到A表中
IF EXISTS(
select 1 from B as b1
left join A as a1
on b1.name = a1.name and b1.time = a1.time
where a1.name is null)

2.判断是否A表中有数据B表中没有的数据
IF EXISTS(
select 1 from B as b1
RIGHT join A as a1
on b1.name = a1.name and b1.time = a1.time
where b1.name is null)

请楼主根据需要自行采用吧.
不可触碰 2007-07-06
  • 打赏
  • 举报
回复
谢谢各位,基本解是
select 1 from A a1
inner join B b1
on a1.[name]=b1.[name] and a1.[time]=b1.[time]
但查询的记录超过B的表中的记录,问是一下是否正常?
其实我就是这意思:

paoluo:
感觉楼主是要检测B表中的数据是否已经存在于A表中了,我的第一个回复和你的回复都是检测B表中是否存在还没有插入到A表中的数据.

34,590

社区成员

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

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