Foxtable(狐表)用户栏目专家坐堂 → [求助]ACCESS中执行和狐表窗口执行的SQL结果不同


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

主题:[求助]ACCESS中执行和狐表窗口执行的SQL结果不同

帅哥,在线噢!
chnfo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2249 积分:18530 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]ACCESS中执行和狐表窗口执行的SQL结果不同  发帖心情 Post By:2018/6/16 10:39:00 [只看该作者]

SQL见附件。
实际试验结果是:
在ACCESS中直接把WBS01和WBS02分别复制到这里
FROM ((WBS01的SQL)as  WBS01 LEFT JOIN (WBS02的SQL) as  WBS02 …………,然后运行,结果正确。

但如果把复制的结果放到FT的窗口中执行,结果就会与ACCESS中直接执行的结果不符,这是为什么呢?。
Dim cmd As new SQLCommand
cmd.C
cmd.CommandText = "WBS03的SQL"

在FT中应当如何组装这个WBS03的SQL?

Dim dt As DataTable = cmd.ExecuteReader()

第二个问题:如果在窗口中使用like [TbWBS].[C] & ".*" 就会出现错误结果,如果把*换成%就可以是正确结果。----是不是在FT中执行SQL时不能用*作为通配符?
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:新建文本文档 (4).txt

[此贴子已经被作者于2018/6/16 10:46:14编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111414 积分:567140 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/6/16 11:01:00 [只看该作者]

把这些表的部分数据导出一个新的access数据库上传测试

 回到顶部
帅哥,在线噢!
chnfo
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2249 积分:18530 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/16 11:45:00 [只看该作者]

测试数据库
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试输出20180616.zip



 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111414 积分:567140 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/6/16 14:20:00 [只看该作者]

汗,测试半天,是*号和%号的问题

WBS01的SQL:
SELECT DISTINCT TbWBS.ID, TbModD.ProID, TbModD.ModID
FROM TbWBS INNER JOIN ((TbModD INNER JOIN TbWL ON (TbModD.ProID = TbWL.ProID) AND (TbModD.WLID = TbWL.ID)) INNER JOIN TbWBS AS TbWBS_1 ON (TbWL.WBSID = TbWBS_1.ID) AND (TbWL.ProID = TbWBS_1.ProID)) ON TbWBS.ProID = TbModD.ProID
WHERE (((TbModD.ProID)="dd95073e-69a5-4213-93df-a732df87dd97") AND ((TbModD.ModID)="7d7bc6fe-b046-4991-8fde-4f72951405e8") AND ((TbWBS_1.C) Like [tbwbs].[C] & '.%' Or (TbWBS_1.C)=[tbwbs].[C]))


在access里执行的时候,like里使用%是没有效果的,必须使用*号。而.net的数据库引擎刚好相反,*号没有用,必须使用%号。所以狐表里的执行结果是正确的

 回到顶部
帅哥,在线噢!
chnfo
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2249 积分:18530 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/16 14:27:00 [只看该作者]

这个问题我是无意中发现的,所以,每次在ACCESS里写了SQL之后,复制出来,都把*替换为%然后执行。

现在我是觉得WBS03的SQL里,需要把WBS01的SQL复制两次,一次是WBS01本身,一次是WBS02里也要用到WBS01的SQL。
是必须要这样吗?

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111414 积分:567140 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/6/16 14:40:00 [只看该作者]

就像现在使用的一样,在access里WBS01做成一个查询,直接调用即可。

至于你sql的完整逻辑,没有看懂,不知道怎么优化

 回到顶部
帅哥,在线噢!
chnfo
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2249 积分:18530 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/16 14:57:00 [只看该作者]

但是WBS01里有条件,这个条件还是变化的。比如ProID,就是项目的ID,它要根据不同的项目,传这个参数进去。
用狐表提供的组合多个查询的方式,倒是可以部分实现,但是在数据量比较大的情况下,比直接SQL执行的效率还是低好多。

前面的逻辑就是:
有一个商品分类表,它的层次结构是用1,1.2,1.2.1这样来识别的。然后末级分类下面有明细。
现在要通过这个月的商品明细的进出情况,找到它的分类直到顶级,然后汇总数量。

WBS01就是通过本月商品的明细找到上级分类。
WBS02就是找到分类在各个月的累计数量
WBS03就是把本月分类的数量和累计数量展示在一起。

这个ProID就相当于各个分店一样
当然,这只是一个比方,不是说就拿这个来说,应当用其它的方式来实现
[此贴子已经被作者于2018/6/16 14:59:08编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111414 积分:567140 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/6/16 15:26:00 [只看该作者]

把需要加条件的列都select到最外层,然后像平时一样加条件到最后即可

其次子查询也可以加条件

FROM ((select * from WBS01 where 条件)as  WBS01 LEFT JOIN (WBS02的SQL) as  WBS02 …………,

 回到顶部
帅哥,在线噢!
chnfo
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2249 积分:18530 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/19 16:02:00 [只看该作者]

再请教:
WHERE (((TbModD.ProID)="dd95073e-69a5-4213-93df-a732df87dd97") AND ((TbModD.ModID)="7d7bc6fe-b046-4991-8fde-4f72951405e8") AND ((TbWBS_1.C) Like [tbwbs].[C] '.%' Or (TbWBS_1.C)=[tbwbs].[C]))

在ACCESS中执行时,在数据量大的情况下(比如tbwbs的数据有10000行),就卡在那里不动了,一直在显示“正在执行查询”。
象这种情况,该如何优化?

这里的C都是用的1,1.2,1.2.3,1.2.3.1,1.2.3.2这样的来表示层级关系的
[此贴子已经被作者于2018/6/19 16:28:50编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111414 积分:567140 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/6/19 17:31:00 [只看该作者]

给C字段加上索引。

like操作本来效率就很低的。可以考虑加载后用代码处理。或者在代码里使用递归进行操作

 回到顶部
总数 12 1 2 下一页