以文本方式查看主题

-  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时不能用*作为通配符?
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:新建文本文档 (4).txt

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

--  作者:有点蓝
--  发布时间:2018/6/16 11:01:00
--  
把这些表的部分数据导出一个新的access数据库上传测试
--  作者:chnfo
--  发布时间:2018/6/16 11:45:00
--  
测试数据库
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试输出20180616.zip



--  作者:有点蓝
--  发布时间: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操作本来效率就很低的。可以考虑加载后用代码处理。或者在代码里使用递归进行操作