设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 8412|回复: 17
打印 上一主题 下一主题

[查询] 跪求多表合并SQL代码

[复制链接]
跳转到指定楼层
1#
发表于 2011-6-20 15:53:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我用的是ACCESS 2007,现在要把两个表合并,具体如下:
表1: 产品种类, 产品名称, 客户名称, 目的国家, 已出货数量
表2:产品种类,产品名称,客户名称,预测数量
现在要把表1和表2合并成表3,做成字段如下:
表3:产品种类,产品名称,客户名称,目的国家,已出货数量,预测数量
其中表1有的一些产品表2不一定有,表2有的表1也不一定有,如果都有的则数据合并,如果没有则全部呈列,我写的SQL代码是:

Select 表1.产品种类 as 产品种类,  表1.产品型号 as 产品型号,  表1.客户名称 as 客户名称, 目的国家, 已出货数量, 预测数量 from 表1 left join 表2 on 表1.产品型号=表2.产品型号
Union
Select 表2.产品种类 as 产品种类, 表2.产品型号 as 产品型号, 表2.客户名称 as 客户名称, 目的国家, 已出货数量, 预测数量 from 表1 right join 表2 on 表1.产品型号=表2.产品型号

运行后郁闷的是结果中表1的数据出现了重复.
例:
第1条记录:产品种类1, 产品名称1, 客户名称1, 目的国家1, 已出货数量1,预测数量0
第2条记录:产品种类1,产品名称1,客户名称1,目的国家1,已出货数量1,预测数量1
这2条记录重复了,而表2的数据只显示在其只1条记录里.

不知道究竟是哪里出了问题,我是ACCESS初学者,求各位路过的大虾帮忙啊!~~~

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享分享 分享淘帖1 订阅订阅
18#
 楼主| 发表于 2011-6-21 12:14:12 | 只看该作者
本帖最后由 yiyucoco 于 2011-6-21 12:14 编辑

完全明白了.那么我只需把Dlookup替换成Dmax函数就可以了.

大力感谢两位版主!!!
17#
发表于 2011-6-21 12:07:36 | 只看该作者
本帖最后由 todaynew 于 2011-6-21 12:13 编辑
yiyucoco 发表于 2011-6-21 09:31
运算过了,完全可用.不过因为是毫无根基的初学者,所以有些地方还是不明白,不要笑我啊~
Nz函数的语法是 Nz(v ...


1、Dlookup函数的第三个参数的使用和理解可请roych版主做重点培训,在此不赘述;

2、关于目的国家于Dlookup结果不对应的问题:需预先在表2中增加“目的国家”字段,并按实际补齐数据,同时联合查询还原写为:
Select 产品种类,产品型号,客户名称, 目的国家, 已出货数量, 0 as 预测数量 from 表1
Union All
Select 产品种类,产品型号,客户名称, 目的国家, 0 as 已出货数量, 预测数量 from 表2

3、关于取某种条件下的最大值问题:与Dlookup功能相近似的有一组叫做域函数的函数,包括Dmax、Dmin、DLast、Dfirst等,可根据需要进行选用,具体用法可在系统中查询“域函数”的说明。
16#
发表于 2011-6-21 11:05:36 | 只看该作者
Dlookup相当于Excel中的Vlookup:
"产品种类='" & [产品种类] & "'
第一个产品种类是数据表中的“产品种类”字段。
第二个产品种类是查询中“产品种类”字段值或者窗体中“产品种类”控件值
15#
 楼主| 发表于 2011-6-21 09:31:15 | 只看该作者
运算过了,完全可用.不过因为是毫无根基的初学者,所以有些地方还是不明白,不要笑我啊~
Nz函数的语法是 Nz(variant,[Valueifnull])这个我看懂了
Dlookup函数的语法是 Dlookup(expr,domain,[criteria])这个没太看懂.
主要是这里:"产品种类='" & [产品种类] & "'
"产品种类='这个明白
"&[产品种类]&"不明白.因为在Office帮助里查不到说明,所以我就汗了....主要是&有什么用,和这里为什么也要用引号呢?

另外运用这个方法又产生了一个不知道是不是问题的问题
因为在表1中,产品种类,产品名称,产品型号,目的国家并不是完全一一对应的,也就是说同样的产品型号,可能有几条记录,有不同的目的国家或者是不同的产品或种类
而表2是没有目的国家这一个字段的,也就是说分辨不出来不同目的国家的情况.
按上面的方法做完后,表2的数据会自动默认成其中的一个目的国家,然后我就很纠结,因为我知道当Dlookup函数的结果出来有几个字段的话,它会使用第一个出现的字段,但我想要的效果是它使用"已出货"中数据最大的字段,这要怎么添加进去呢?
14#
发表于 2011-6-21 08:21:27 | 只看该作者
回复 todaynew 的帖子

版主威武。强悍
!!学习了!
13#
发表于 2011-6-20 18:01:21 | 只看该作者
本帖最后由 todaynew 于 2011-6-20 18:03 编辑
yiyucoco 发表于 2011-6-20 17:22
不对.如果取最大值的话,当产品种类和产品名称一样,但目的国家有二条记录的时候,就只有一条记录了.我的办法不 ...


把联合查询稍该一下即可:
Select 产品种类,产品型号,客户名称, 目的国家, 已出货数量, 0 as 预测数量 from 表1
Union All
Select 产品种类,产品型号,客户名称, nz(Dlookup("目的国家","表1","产品种类='" & [产品种类] & "'  and 产品型号='" & [产品型号] & "' and 客户名称='" & [客户名称] & "'"),"") as 目的国家, 0 as 已出货数量, 预测数量 from 表2
12#
 楼主| 发表于 2011-6-20 17:53:45 | 只看该作者
嗯.问题还是没有解决.
1.如果条件设置为is not null, 那么一些表1里没有而表2里有的数据就不显示了(表2是没有目的国家的),所以总数对不上.
2.如果用分组查询的方式,则没办法实现数据的合并.仍然会是表1的数据1行,表2的数据1行.

谢谢版主
11#
发表于 2011-6-20 17:43:38 | 只看该作者
回复 yiyucoco 的帖子

1、建议在做的分组查询里设置条件,把“目的国家”的条件设置为Is Not Null。
2、为了不遗漏任意一条记录,还是选择默认的“分组”吧。最大值或者最小值都只会返回一条不重复记录的,而分组则是除非全部字段内容都一样时,才会返回一条记录。
3、关于Access,建议先买一本结合实例的书看看,主要学着怎么熟悉数据表、查询、窗体和宏。代码后面自然会接触到的。
10#
 楼主| 发表于 2011-6-20 17:22:05 | 只看该作者
不对.如果取最大值的话,当产品种类和产品名称一样,但目的国家有二条记录的时候,就只有一条记录了.我的办法不行.有别的办法吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-11 20:54 , Processed in 0.109225 second(s), 37 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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