设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1839|回复: 4
打印 上一主题 下一主题

[Access本身] ACCESS 中 和SQLSERVER 中结果不一样?

[复制链接]
跳转到指定楼层
1#
发表于 2012-5-12 08:53:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在ACCESS中有一个查询,因用的是K3的链接表,反应较慢,我想直接做到K3的SQLSERVER里面,但发现在ACCESS里面执行有11000行,但在SQLSERVER里面只有7000多行,哪位老师帮忙看一下有什么问题,谢谢!


ACCESS中是:SELECT 任务调整.FNumber AS 产品图号, 任务调整.计划开工日期, 任务调整.计划完工日期, 任务调整.计划生产数量, BOM1.物料代码, BOM1.规格型号, BOM1.物料名称, 任务调整.计划生产数量*BOM1.用量*(1+[损耗率]/100) AS 用量, BOM1.发料仓库, 任务调整.FBillNo AS 生产任务单号
FROM 任务调整, BOM1
WHERE (((任务调整.FNumber)=[BOM1].[产品图号]) AND ((BOM1.发料仓库)="原材料库" Or (BOM1.发料仓库)="零部件库" Or (BOM1.发料仓库)="辅料库" Or (BOM1.发料仓库)="前工序仓库" Or (BOM1.发料仓库)="半成品库") AND ((任务调整.FStatus)=0));


SQLSERVER中是:SELECT     dbo.任务调整.FNumber AS 产品图号, dbo.任务调整.计划开工日期, dbo.任务调整.计划完工日期, dbo.任务调整.计划生产数量, dbo.我BOM1.物料代码,
                      dbo.我BOM1.规格型号, dbo.我BOM1.物料名称, (dbo.任务调整.计划生产数量 * dbo.我BOM1.用量) * (1 + dbo.我BOM1.损耗率 / 100) AS 用量, dbo.我BOM1.发料仓库,
                      dbo.任务调整.FBillNo AS 生产任务单号
FROM         dbo.任务调整 INNER JOIN
                      dbo.我BOM1 ON dbo.任务调整.FNumber = dbo.我BOM1.产品图号
WHERE     (dbo.任务调整.FStatus = 0) AND (dbo.我BOM1.发料仓库 = '零部件库' OR
                      dbo.我BOM1.发料仓库 = '原材料库' OR
                      dbo.我BOM1.发料仓库 = '前工序仓库' OR
                      dbo.我BOM1.发料仓库 = '辅料库' OR
                      dbo.我BOM1.发料仓库 = '半成品库’')
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2012-5-12 10:28:59 | 只看该作者
本帖最后由 roych 于 2012-5-12 10:33 编辑

Access里的写法和SQL的不一样,自然结果就不同了:
由于你的Access代码里没有写上内联接(INNER JOIN),那么必然是一个笛卡儿积,也就是相当于表1*表2的记录,自然比SQL Sever的记录要多一些了。
这里是根据你所提供的代码所修改而成,仅供参考(由于没有附件,未经测试):
  1. SELECT 任务调整.FNumber AS 产品图号, 任务调整.计划开工日期, 任务调整.计划完工日期, 任务调整.计划生产数量, 我BOM1.物料代码, BOM1.规格型号, BOM1.物料名称, (任务调整.计划生产数量 * BOM1.用量) * (1 + BOM1.损耗率 / 100) AS 用量, BOM1.发料仓库, 任务调整.FBillNo AS 生产任务单号 FROM 任务调整
  2. INNER JOIN BOM1 ON 任务调整.FNumber = BOM1.产品图号
  3. WHERE 任务调整.FStatus = 0 AND BOM1.发料仓库 In ( "零部件库" , "原材料库" , "前工序仓库", "辅料库" , "半成品库")
复制代码
说明:个人觉得In代替Or会简洁些,所以修改成这样了。
3#
 楼主| 发表于 2012-5-12 12:32:30 | 只看该作者
谢谢版主的回复,我将在SQLSSERVER测试了一下,出来的数据量和ACCESS里是一样的,另外之前我将语句改成下面的样子,出来的结果也是和ACCESS里的数据是一样的。
另外我在ACCESS里的是没有内联接的,但将其复制进SQLSERVER里就变成有内联接的了,出来的数据就不一样的。刚才又将ACCESS里的句子变成内联接,出来的数据也和没有内联接的是一样的。
因此,我有点不明白了,到底哪一种方法是正确的?

SQLSERVER新句子:

SELECT     dbo.任务调整.FNumber AS 产品图号, dbo.任务调整.计划开工日期, dbo.任务调整.计划完工日期, dbo.任务调整.计划生产数量, dbo.我BOM1.物料代码,
                      dbo.我BOM1.规格型号, dbo.我BOM1.物料名称, (dbo.任务调整.计划生产数量 * dbo.我BOM1.用量) * (1 + dbo.我BOM1.损耗率 / 100) AS 用量, dbo.我BOM1.发料仓库,
                      dbo.任务调整.FBillNo AS 生产任务单号
FROM         dbo.任务调整 INNER JOIN
                      dbo.我BOM1 ON dbo.任务调整.FNumber = dbo.我BOM1.产品图号
WHERE     (dbo.任务调整.FStatus = 0) AND (dbo.我BOM1.发料仓库 = '原材料库') OR
                      (dbo.任务调整.FStatus = 0) AND (dbo.我BOM1.发料仓库 = '零部件库') OR
                      (dbo.任务调整.FStatus = 0) AND (dbo.我BOM1.发料仓库 = '辅料库') OR
                      (dbo.任务调整.FStatus = 0) AND (dbo.我BOM1.发料仓库 = '前工序仓库') OR
                      (dbo.任务调整.FStatus = 0) AND (dbo.我BOM1.发料仓库 = '半成品库')

4#
发表于 2012-5-13 01:20:15 | 只看该作者
本帖最后由 roych 于 2012-5-13 01:22 编辑
tianya0073 发表于 2012-5-12 12:32
谢谢版主的回复,我将在SQLSSERVER测试了一下,出来的数据量和ACCESS里是一样的,另外之前我将语句改成下面 ...


1、Access中内联接是需要自己建立的(因为你只是链接SQL后台,并没有对链接表建立起关系)。
2、为什么Access里没有内联接而把代码复制到SQL里去时就自动建立内联接呢?这主要归功于SQL Sever里预先建立好的关系。
3、我在2L提供的例子是根据你的SQL Sever语句修改成Access使用的,新SQL Sever语句的转换可以参考2L的Access SQL语句。
4、SQL Sever部分建议垂询zhuyiwen版主。如果你同意的话,此贴将被移动到ADP区。
5#
 楼主| 发表于 2012-5-14 09:09:15 | 只看该作者
非常感谢版主的耐心回复,昨天我又仔细试了试,终于让我发原因了,原来我将代码复制进SQL SERVER 时,由于要将双引号改成单引号,在改的时候将多了一个单引号,所以结果不一样了。

OR  dbo.我BOM1.发料仓库 = '半成品库‘')

这多出的单引号很难发现,所以纠结了很久。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-2 12:07 , Processed in 0.096794 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表