以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [求助]ACCESS中执行和狐表窗口执行的SQL结果不同 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=120462) |
||||
-- 作者:chnfo -- 发布时间:2018/6/16 10:39:00 -- [求助]ACCESS中执行和狐表窗口执行的SQL结果不同 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时不能用*作为通配符?
[此贴子已经被作者于2018/6/16 10:46:14编辑过]
|
||||
-- 作者:有点蓝 -- 发布时间:2018/6/16 11:01:00 -- 把这些表的部分数据导出一个新的access数据库上传测试 |
||||
-- 作者:chnfo -- 发布时间:2018/6/16 11:45:00 -- 测试数据库 |
||||
-- 作者:有点蓝 -- 发布时间: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 -- 发布时间:2018/6/16 14:27:00 -- 这个问题我是无意中发现的,所以,每次在ACCESS里写了SQL之后,复制出来,都把*替换为%然后执行。 现在我是觉得WBS03的SQL里,需要把WBS01的SQL复制两次,一次是WBS01本身,一次是WBS02里也要用到WBS01的SQL。 是必须要这样吗?
|
||||
-- 作者:有点蓝 -- 发布时间:2018/6/16 14:40:00 -- 就像现在使用的一样,在access里WBS01做成一个查询,直接调用即可。 至于你sql的完整逻辑,没有看懂,不知道怎么优化
|
||||
-- 作者:chnfo -- 发布时间: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编辑过]
|
||||
-- 作者:有点蓝 -- 发布时间:2018/6/16 15:26:00 -- 把需要加条件的列都select到最外层,然后像平时一样加条件到最后即可 其次子查询也可以加条件 FROM ((select * from WBS01 where 条件)as WBS01 LEFT JOIN (WBS02的SQL) as WBS02 …………,
|
||||
-- 作者:chnfo -- 发布时间: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编辑过]
|
||||
-- 作者:有点蓝 -- 发布时间:2018/6/19 17:31:00 -- 给C字段加上索引。 like操作本来效率就很低的。可以考虑加载后用代码处理。或者在代码里使用递归进行操作
|