暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

VBA SQL 交叉连接查询

Excel VBA练习 2021-07-15
2234

昨天写了篇多表连接查询

那么今天就写交叉连接查询

如下图所示


这是一份采购列表,AB列为采购数量 DE列为采购单价

其中,在单价表中角钢以及三脚架出现了两种不同的单价



代码如下

     strSQL = "Select a.*,单价 From " & strSource & "a," & strSource1 & "b Where a.名称=b.名称 Order By a.名称"


    在上述代码运行中,例如采购列表中角钢出现了3次,而单价列表中角钢的单价出现了2次,进行了多表连接后,角钢的记录出现了6条,既3*2=6,这显示了所有可能的组合和排列,也就是多对多的关系,而这种关系现象称之为笛卡尔积现象

    笛卡尔积,也就是列出了连接表之间行的所有可能组合

    在SQL中,我们都尽量避免出现笛卡尔积的出现,假设,角钢是1000行,而单价表也是1000行,也就是1000*1000...从而会导致结果表容易变得异常庞大,想想,如果数据在大一点呢

    当然,也有用到笛卡尔积的时候,比如说,需要列出所有的组合排列


    再来,如下图所示


    假设,需要对1-9排列出3个数为一组的的组合,关于这个问题,小编经常有看到小伙伴在问…

    先上动图



      strSQL = "select * From " & strSource & "a," & strSource & "b," & strSource & "c Where a.序号<b.序号 and b.序号 < c.序号 Order By a.序号,b.序号,c.序号 "


      交叉连接是组合两个表的另一种方式,但是,这种只能用于小型的数据表

      该连接会将第一个表的每一行和第二个表的每一行相匹配,产生了所有可能的组合

      利用Where子句限制了一定的条件

      看到这里,可能小伙伴会有点疑问,这个怎么好像又和那个叫卡卡的一样

      嗯,确实是一样的,交叉连接也是称之为笛卡尔积...


      在写一个例子,睡觉~


      如下图所示


      我想生成一组数字,0至30...



        strSQL = "select a.数字*10+b.数字 As 序列 From " & strSource & "a," & strSource & "b Where a.数字*10+b.数字<=30 Order By 1"


        还是利用了交叉连接,最后使用Order By 排序


        示例文件下载

        链接:https://pan.baidu.com/s/1-kZsOxdVhZ7MqdLOWU1JHA

        提取码:abcd


        收工!

        如果小伙伴有好的思路,可以在小编的公众号留言发给小编研究下

        文章觉得有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力

        关注公众号 ↓


        文章转载自Excel VBA练习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论