ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] SQL left join为什么没有返回左表全部的行,排序也不是按照左表的排序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-8-25 09:29 | 显示全部楼层 |阅读模式
如附件所示,使用查询语句 strSQL = "select a.用户序号,b.产品标志 from [3月$A1:A] a left join [3月产品$A1:B] b on a.用户序号=b.用户序号"  查询出来的结果自动被排序了,没有按照左表的顺序输出,另外,查询出来的结果总行数也比左表的总行数要少,这是为什么?百思不得解,谁有空帮忙看看

数据.rar (1.1 MB, 下载次数: 19)

TA的精华主题

TA的得分主题

发表于 2017-8-25 09:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
select a.用户序号,b.产品标志 from [3月$A1:A] a left join [3月产品$A1:B]

[3月$A1:A] 这种表示方法会多空白数据行,需要限定区域。

比如 [3月$A1:A99] 这样的

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-8-25 09:53 | 显示全部楼层
魂断蓝桥 发表于 2017-8-25 09:38
select a.用户序号,b.产品标志 from [3月$A1:A] a left join [3月产品$A1:B]

[3月$A1:A] 这种表示方法会 ...

没有用的,你可以试一下,不是这个问题,表格当中有数据7.4万行,如果改成 from [3月$A1:A74436]  报错,只要超过65536就报错,就算你改成65536  查询出来的结果排序不对,查询得到的行数也比实际行数要少

TA的精华主题

TA的得分主题

发表于 2017-8-25 09:57 | 显示全部楼层
写法问题
改成
  1. select a.用户序号,b.产品标志 from [3月$] a left join [3月产品$] b on a.用户序号=b.用户序号 where a.用户序号 is not Null
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-8-25 10:02 | 显示全部楼层

厉害,查询出来的总行数确实没有少,郁闷的是,左表当中确认没有空单元格,怎么加个 a.用户序号 is not Null 就可以解决呢,还有个排序问题,查询出来的结果,为什么会自动排序?没有按照左表的顺序输出?

TA的精华主题

TA的得分主题

发表于 2017-8-25 10:07 | 显示全部楼层
huang1314wei 发表于 2017-8-25 10:02
厉害,查询出来的总行数确实没有少,郁闷的是,左表当中确认没有空单元格,怎么加个 a.用户序号 is not N ...

7万行下面都是空白咧,至于排序问题,我没法解释啊,它就是这么玩的

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-8-25 10:11 | 显示全部楼层
笑着...两年过去 发表于 2017-8-25 10:07
7万行下面都是空白咧,至于排序问题,我没法解释啊,它就是这么玩的

好的,感谢兄台的解答,看来只能通过加个标志ID再排序回来解决了

TA的精华主题

TA的得分主题

发表于 2017-8-25 10:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
huang1314wei 发表于 2017-8-25 09:53
没有用的,你可以试一下,不是这个问题,表格当中有数据7.4万行,如果改成 from [3月$A1:A74436]  报错, ...

2010 应该就这样的,如果超过65535行,你就必须用10的引擎,但用了10就不能限定区域。

折中的办法是,用03的引擎,然后限定区域返回正确的结果。

我试了一下,用10的引擎,1000条之内也是准确的。

Sub Test4()
   Dim cnn As Object
Dim Sql As String
Set cnn = CreateObject("ADODB.CONNECTION")
cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended Properties='Excel 8.0;HDR=YES'; Data Source=" & ThisWorkbook.FullName
'cnn.Open "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=YES'; Data Source=" & ThisWorkbook.FullName
    Sql = "select a.用户序号,b.产品标志 from [3月$a1:a65534] a left join [3月产品$a1:b] b on a.用户序号=b.用户序号"
    [c:d] = ""
    Sheet1.Range("c2").CopyFromRecordset cnn.Execute(Sql)
    cnn.Close
    Set cnn = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2017-8-25 12:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-8-25 12:26 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 20:27 , Processed in 0.043842 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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