从两个数据库中取得结果集的最优方法求解

SP12345678902 2011-03-09 10:42:08
大虾们好

我最近遇到一个问题

VB代码,从两个数据库中取得结果集

然后取这两个结果集的交集
Recordset1结果集形如
restaurant0001
restaurant0005
restaurant0009
restaurant0010
....
Recordset2结果集形如
restaurant0001
restaurant0005
restaurant0006
restaurant0011
....

因为是2个数据库,所以直接在SQL上面做文章我认为已经不可能

我已经想到2个方法,但是效率都不高
1.Recordset1和Recordset2取出来之后,利用拿Recordset1的每一个去Recordset2里面去查,找到就把它塞到Recordset3中
这是双重循环,偏偏我的数据量很大,每个结果集估计5000条数据,效率不高
2.利用Recordset自带的Recordset2.find "restaurantcode = ''",拿Recordset1的每一个去Recordset2里面去find ,找到就把它塞到Recordset3中,已经试过了,这个效率也很差,估计也是双重循环

请高手指点迷津,定送分
...全文
156 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinaboyzyq 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yunmingqu 的回复:]

vb
sql server 2005


SELECT *
FROM sjb
UNION
SELECT *
FROM OPENROWSET('SQLOLEDB', '127.0.0.1'; 'sa'; 'dg', master.dbo.sjb)


127.0.0.1改成远程服务器IP
vbman2003 2011-03-09
  • 打赏
  • 举报
回复
才发现原来是一问2贴....
SP12345678902 2011-03-09
  • 打赏
  • 举报
回复
vb
sql server 2005
vbman2003 2011-03-09
  • 打赏
  • 举报
回复
是什么数据库?8楼的方法只适用于同一服务器上的sql数据库...
  • 打赏
  • 举报
回复
那应该用4楼的in,我用的是informix。

select a from instance1:table1@host1 where a in (select a from instance2:table2@host2)
instance 和 host 和 table name 均可不同,但一定要连接的上
chinaboyzyq 2011-03-09
  • 打赏
  • 举报
回复
SQL SERVER不在同一服务器上也可以用SQL语句实现。
chinaboyzyq 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yunmingqu 的回复:]
不在同一服务器上
[/Quote]
SQL SERVER不在同一服务器上也可以用SQL语句实现。
chinaboyzyq 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 yunmingqu 的回复:]
因为是2个数据库,所以直接在SQL上面做文章我认为已经不可能
[/Quote]
这句话你就说错了,你可连接一个数据库同时与别一个数据库一起操作。方式大体如下:
比如你连接打开pubs中的表sjb同时操作master中的sjb,两个表名可以不同。

SELECT *
FROM sjb
UNION
SELECT *
FROM master.dbo.sjb

dbo可以省略写成master..sjb
SP12345678902 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 vbman2003 的回复:]
不一定的,要看你是什么数据库,是不是在同一服务器上等等信息....
[/Quote]


不在同一服务器上
SP12345678902 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 patrickkong 的回复:]
你是不是要得到这两个?相同的,这个column是不是唯一的
restaurant0001
restaurant0005
[/Quote]

是的,是唯一的
vbman2003 2011-03-09
  • 打赏
  • 举报
回复
因为是2个数据库,所以直接在SQL上面做文章我认为已经不可能
--------------------
不一定的,要看你是什么数据库,是不是在同一服务器上等等信息....
无·法 2011-03-09
  • 打赏
  • 举报
回复
union是直接拼接,不是取交集。
如果是同一个数据库的话用select xx from xxx where xxx in(select xxxx)应该可以。不同数据库的貌似不行。

select xx from xxx where xxx in(user ddd;select xxxx),在in里面加个改变当前数据库看看,不知道行不行。
  • 打赏
  • 举报
回复
你是不是要得到这两个?相同的,这个column是不是唯一的
restaurant0001
restaurant0005
SP12345678902 2011-03-09
  • 打赏
  • 举报
回复
楼上的,我不太理解
仅仅指的是把两个select结果集union吗
请明示
  • 打赏
  • 举报
回复
union select 可以从不同的数据库。
chinaboyzyq 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yunmingqu 的回复:]

我不知道客户的数据库构架,所以数据库语句直接完成真的实现不了

[/Quote]
你的两个记录集是怎么来的?你不用连接数据库?也不用打开数据表?
chinaboyzyq 2011-03-09
  • 打赏
  • 举报
回复
用第1个查询的结果做第2个查询的条件,则得到是就是交集:

SELECT *
FROM OPENROWSET('SQLOLEDB', '127.0.0.1'; 'sa'; 'dg', master.dbo.sjb)
Rowset_1
WHERE (日期 IN
(SELECT 日期
FROM sjb))
SP12345678902 2011-03-09
  • 打赏
  • 举报
回复
xxxx代表Recordset1拼接成的字符串
SP12345678902 2011-03-09
  • 打赏
  • 举报
回复
Recordset2.filter = 'restaurant in (xx,xx,xx,xxx,xx,xxxx,xxx,x)'

xxxx代表Recordset2拼接成的字符串

我觉得这个是个好注意,我试试
SP12345678902 2011-03-09
  • 打赏
  • 举报
回复
我不知道客户的数据库构架,所以数据库语句直接完成真的实现不了

我想找出效率最高的取交集的算法,呵呵

2,462

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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