Office中国论坛/Access中国论坛

标题: ACCESS 中 和SQLSERVER 中结果不一样? [打印本页]

作者: tianya0073    时间: 2012-5-12 08:53
标题: ACCESS 中 和SQLSERVER 中结果不一样?
我在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.发料仓库 = '半成品库’')
作者: roych    时间: 2012-5-12 10:28
本帖最后由 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会简洁些,所以修改成这样了。
作者: tianya0073    时间: 2012-5-12 12:32
谢谢版主的回复,我将在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.发料仓库 = '半成品库')


作者: roych    时间: 2012-5-13 01:20
本帖最后由 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区。
作者: tianya0073    时间: 2012-5-14 09:09
非常感谢版主的耐心回复,昨天我又仔细试了试,终于让我发原因了,原来我将代码复制进SQL SERVER 时,由于要将双引号改成单引号,在改的时候将多了一个单引号,所以结果不一样了。

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

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







欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3