载入中。。。 'S bLog
 
载入中。。。
 
载入中。。。
载入中。。。
载入中。。。
载入中。。。
载入中。。。
 
填写您的邮件地址,订阅我们的精彩内容:


 
sql多表查询之不等连接Inequality-Join
[ 2011/6/21 13:06:00 | By: 梦翔儿 ]
 

今天看sigmod2011的论文关于mapreduce来解决不等值连接问题,所以网络科普了一下:

    今天我们要介绍的是sql多表查询不等连接,想知道怎么样用一句SQL得到每日的库存结余吗,那么你千万不要错过今天的内容!

  可能有朋友要问了,什么是不等连接呢?

        通常来说,SQL语言进行的都是无序操作。想要进行有序的处理,比如比较一个序列的前后项,必须要使用游标。但是,在有些场合下,可采用另一种方法,不用游标,一样能处理有序的信息,这就是不等联接。

  看看下面的例子你就更加明白什么是不等连接了。

  我有一张表

 

 

  现在我希望通过一条查询语句使它变成

 

 

  看到没有,记录数变多了,仅用我们之前学到的a join b where a.XX=b.YY能解决问题吗?

   想想,再看答案

  select _a.ordinal from @a _a join @a _b on _a.ordinal<=_b.ordinal
  总结:

  连接条件不为=号的统称不等连接
 <>,> ,<,like,not in,not exists…..都可以做为连接条件
  这个例子有些抽象,也许大家会说,我用不上这种查询

  我给你看看下面这个案例,您就知道这个不等连接有多实用啦

  做过企业信息系统应该都知道进销存吧,那么,下面这是一张入库明细表

  它记录了每天的入库情况

 

 

  现在我希望得到每个产品每次入库之后的库存变化情况,如下表所示:

 

  这该怎么办呢?

        直观上来讲,我们可以在入库明细表上建一个游标,从第一条开始,每一条,加一次。

       也许有些朋友还可以想到用update,不错啦!

       但是,只有这些方法吗???

       当然不,我们可以用一句SQL搞定,相信吗?

  试试,再看答案

Select
       _b.入库日期,_a.产品,sum(_a.数量) 当前库存

       from @入库表 _a

       join @入库表 _b

       on _a.产品=_b.产品 and _a.入库日期<=_b.入库日期

       group by _b.入库日期,_a.产品

   不等联接本身就不是一一对应,它的对应关系和顺序有着密切的关系。这也就是我们能够拿它来进行有序操作的原因。这就是不等连接,这次知道了吧!

 

        不等联接查询的有序操作能力,显然来自联接字段的可排序和互异性,所以,最好不要在有重复值的字段上做不等联接(事实上,最好不要在有重复值的字段上做任何联接,除非你非常肯定你在干什么)。等值联接出现数据爆炸就够可怕的了,不等联接要是玩爆了……嘿嘿嘿……

 

       想像一个等值联接中有一对重复值,可能出现两对重复结果。不过要是不等联接,就和重复的位置有关了。因为这是一个三角形,所以出现在最上面还好,要是出现在这个三角形的下部……

 

       小忠告:不等联接查询,显然是一个有力的工具,但它也是招来麻烦的快捷方式之一。有几个小忠告:


        1、如果联接会生成很大的“三角形”,就不要用,试试子查询或哪怕游标;

       2、生成的结果集相对于原表越小越好,尽可能地把无用的数据先过滤掉;

       3、用不等联接进行数列计算会表达的很清楚(因为是�**袒模ǔT谛噬纤挥惺裁从攀疲裕绞蓖嫱婵梢裕嬗玫幕白詈孟瓤悸呛茫�

       4、还有就是不等联接不要轻易用在多重联接中,否则可能会引起杠杆作用。

 

  不等连接很神奇吧,功能很强大吧:D,祝大家在这个神奇的世界中旅行愉快!

http://www.oecp.cn/hi/xj/blog/236

 
 
  • 标签:不等连接 
  • 发表评论:
    载入中。。。

     
     
     

    梦翔儿网站 梦飞翔的地方 http://www.dreamflier.net
    中华人民共和国信息产业部TCP/IP系统 备案序号:辽ICP备09000550号

    Powered by Oblog.