Foxtable(狐表)用户栏目专家坐堂 → 求一段找出表B Not in 表A的行的代码


  共有1603人关注过本帖树形打印复制链接

主题:求一段找出表B Not in 表A的行的代码

帅哥哟,离线,有人找我吗?
chen3728060
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
求一段找出表B Not in 表A的行的代码  发帖心情 Post By:2017/2/12 17:44:00 [只看该作者]

我有2个商品条码库,表A是98w条,表B是55w条。表A包含了表B所有的条码。(这2个商品条码库架构一样,只有一列,就是ItemID,而且条码不重复,是别人给我的,一个是2017年的,一个是2009年的,所有相差了这么多)

 

我想问下,假如在不直接写 sql语句的情况下,能利用狐表的工具(例如 SqlJoindatatable, sqlGroupDatatable之类),提取出表A比表B多的43w条码吗?

 

千万不要想下面这种,那个string已经爆了,装不下几十万条条码。而且效率也low爆了

Dim s As String = DataTables("表B").SQLGetComboListString("ItemID")
s= "('" & s.Replace("|","','") & "')"


Dim drs As List(of DataRow)  = DataTables("表A").SQLSelect("ItemID not in " & s )

 

求一段提取出表A比表B多的43w行的代码,效率不要太差即可,不要求极致优化图片点击可在新窗口打开查看~谢谢

[此贴子已经被作者于2017/2/12 17:46:05编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点色
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/2/12 17:48:00 [只看该作者]

直接写即可

 

Dim drs As List(of DataRow)  = DataTables("表A").SQLSelect("ItemID not in (select ItemID From {表B})")

 


 回到顶部
帅哥哟,离线,有人找我吗?
rjh4078
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐精 帖子:3355 积分:24732 威望:0 精华:0 注册:2012/3/26 21:47:00
  发帖心情 Post By:2017/2/12 18:46:00 [只看该作者]

增加一个SQL查询表 处理起来方便很多

 

代码如下

se lect * from{表A} wh ere itemid not in (se lect itemid from{表B})

 


 回到顶部
帅哥哟,离线,有人找我吗?
chen3728060
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
回复:(有点色)直接写即可?Dim drs As Lis...  发帖心情 Post By:2017/6/30 20:46:00 [只看该作者]

我看网上有好多讨论sql  in 和 exists 效率的问题,都说in 和not 是全表检索,会很卡之类的,但是刚才这个not in的语句确实很直观,

 

DataTables("表A").SQLSelect("ItemID not in (select ItemID From {表B})")

 

会不会效率很差的?还是狐表已经优化好检索代码了?

[此贴子已经被作者于2017/6/30 20:47:08编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107014 积分:544295 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/6/30 22:03:00 [只看该作者]

给2个表的ItemID都加上索引。

后台查询优化是数据库的事,狐表帮不上什么忙。

DataTables("表A").SQLSelect的话也只能这样用了。

如果是sql,下面2种方式可以自己测试一下,看数据库的执行计划,我这边数据少,看不出区别

Select a.* from 表A As a left join 表B As b on a.ItemID = b.ItemID where b.ItemID is null

select * from 表A where ItemID not in(select ItemID from 表B)

 回到顶部