ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3394|回复: 20

[求助] 求SQL语句一条

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-12-27 13:15 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
表1
名称 数量 号码
A     1       0001
B    10      0002
B    11       0003
表2
名称 数量 号码
A     1       10001
B    10      10002
B    12      10003
A    1        10004

结果要求
表1记录对应表2名称、数量相同的记录(一对一关系),并将对应的表2的号码查询到表3上
表3
名称 数量 号码    号码2
A     1       0001    10001
B    10      0002     10002
求SQL语句
SQL="SELECT ......."

TA的精华主题

TA的得分主题

发表于 2012-12-27 13:21 | 显示全部楼层
select A.*,B.号码 as 号码2 FROM 表1 A LEFT JOIN 表2 B ON A.名称=B.名称 AND A.数量=B.数量

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-27 15:50 | 显示全部楼层
不是我要的结果,不好意思,我补充一下,表1中对应上的表2的记录,就不再去匹配了。譬如表1的 A 1 0001 找到A2的 A 1 10001就不再去找表2 的 A 1 10004了

TA的精华主题

TA的得分主题

发表于 2012-12-27 16:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
flyhorse55 发表于 2012-12-27 15:50
不是我要的结果,不好意思,我补充一下,表1中对应上的表2的记录,就不再去匹配了。譬如表1的 A 1 0001 找到 ...

查找关系到底是怎么样的?工具名称和数量查找出多个对应项,那么应返回哪个对应项?最大值?最后出现值?按你3楼的说法,就不是一对一的关系了.

TA的精华主题

TA的得分主题

发表于 2012-12-27 19:01 | 显示全部楼层
首先,我这里要说明,你在给出问题时要说清楚表的结构,
我这里先认为你的表1的主键(或唯一索引)为:名称+数量,表2的主键(或唯一索引)为:名称+数量+号码
select A.*,B.号码 as 号码2 FROM 表1 A LEFT JOIN (Select 表2.名称,表2.数量,first(表2.号码) as 号码 From 表2 Group by 表2.名称,表2.数量) B ON A.名称=B.名称 AND A.数量=B.数量

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-28 10:05 | 显示全部楼层
非常感谢各位老师
sheet1:
名称        数量        日期        号码
a        1        2012-4-2        0011223
b        2        2012-5-2        0011224
c        1        2012-6-2        0011225
a        1        2012-7-2        0011226
b        3        2012-8-2        0011227
c        5        2012-9-2        0011228

sheet2
名称        数量        日期        号码
a        1        2012-4-2        S0011223
b        2        2012-5-2        S0011224
c        1        2012-6-2        S0011225
a        1        2012-7-2        S0011226
c        5        2012-9-2        S0011228
用Renco的SQL那句
查询的结果为:
名称        数量        日期        号码        号码2
a        1        2012-4-2        0011223        S0011223
b        2        2012-5-2        0011224        S0011224
c        1        2012-6-2        0011225        S0011225
a        1        2012-7-2        0011226        S0011223
b        3        2012-8-2        0011227       
c        5        2012-9-2        0011228        S0011228
如果没有 b           3        2012-8-2        0011227这条记录就完美了,就是我想要的数据
其实我就是对账用的,表1的一条记录名称和数量与表2的名称数量相同一条记录对上了,就把两表相同的记录查询出来,并且用表2的单据号码写过来作为核对标志,就OK了。这样我就知道表1 的记录对应的是表2的那条记录(通过写过来的单据号码知道)
Dim CNN1 As New ADODB.Connection
Dim CNN2 As New ADODB.Connection
Dim RS1  As New ADODB.Recordset
Dim RS2  As New ADODB.Recordset

Dim i%
Set xlapp = CreateObject("Excel.Application")
Set CNN1 = New ADODB.Connection
CNN1.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:\cs1.xlsx; Extended Properties='Excel 12.0;HDR=YES'"
CNN1.Open
If CNN1.State = adStateOpen Then
   MsgBox "连接成功"
Else
   MsgBox "连接失败"
End If

With xlapp
   ' .Visible = True
Sql = "select A.*,B.号码 as 号码2 FROM [sheet1$] A LEFT JOIN (Select [sheet2$].名称,[sheet2$].数量,first([sheet2$].号码) as 号码 From [sheet2$] Group by [sheet2$].名称,[sheet2$].数量) B ON A.名称=B.名称 AND A.数量=B.数量"
    Set RS1 = New ADODB.Recordset
    RS1.Open Sql, CNN1, adOpenStatic, adLockOptimistic
Application.ScreenUpdating = False

Range("a1:f30").ClearContents
    For i = 0 To RS1.Fields.Count - 1
        Cells(1, i + 1) = RS1.Fields(i).Name
    Next i
    Range("a2").CopyFromRecordset RS1
End With
Application.ScreenUpdating = True

TA的精华主题

TA的得分主题

发表于 2012-12-28 10:23 | 显示全部楼层
将LEFT JOIN改为INNER JOIN

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-28 11:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 flyhorse55 于 2012-12-28 11:41 编辑

我还是发现
查询到的记录
a        1        2012-7-2        0011226        S0011223
应该为a        1        2012-7-2        0011226        S0011226
因为表1中a 1 0011223的记录和表2中a 1 S0011223的记录已经匹配好了。不应该再出现。
应该在表1中第二条a 1 0011226的记录和表2中的第二条记录 a 1 s0011226记录匹配
我这样说清楚吗?
SQL可以做到吗

TA的精华主题

TA的得分主题

发表于 2012-12-28 11:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
直到现在我还是没有弄清除你的题意{:soso_e127:}

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-28 11:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我用VBA可以实现,同一名称、同一数量的条件,表1的第一条记录去历遍表2的每一条记录,匹配后两表记录分别标示'Y',并把对方的单据号码写过来。再循环表1 的第二条记录去历遍表2的没有标示'Y'的余下每一条记录。这样循环下来能找到符合条件匹配的记录。但这样处理,数据处理很慢要1-2秒钟一条,两表记录分别有10万条之多。所以想用SQL看快些不,但是,我对SQL语句不太熟,所以这里搞不定了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 01:29 , Processed in 0.032392 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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