zoukankan      html  css  js  c++  java
  • SQL Server Join 连接和笛卡尔积问题

    以前学习sqlserver join的时候以为连接都是笛卡尔积方式连接。后面看到经典的SQL Server join连接的算法。

    感觉有疑问,故查阅资料并做测试整理下:

    一、(多表)连接方式分类

         T-SQL提供两种连接方式:传统方式和SQL连接方式

          1.传统方式:SELECT 列1,列2,列3.... FROM  表1,表2,表3... WHERE condition

                这种方式会把表1,2,3做笛卡尔积(根据测试结果推测,不一定准确)

          2.SQL连接方式:

                1>.INNER JOIN,内联,系统默认,相当于JOIN 。返回多表之间完全匹配的结果。

    2>.LETF JOIN ,左联,返回除了有完全匹配的结果还有左表所有行。

    3>.RIGHT JOIN ,右联,返回除了有完全匹配的结果还有右表所有行。

    4>.Full JOIN ,完全外链接,返回除了有完全匹配的结果还有左右表所有行。

    其中LETF JOIN、RIGHT JOIN和Full JOIN 均属于外连接(OUTER JOIN)

    5>.CROSS JOIN,交叉连接,又称为自然连接,即生成一个笛卡尔积。(应该类似于传统方式)

    二、SQL Server JOIN 内部实现的三种算法:

        1. Loop join(嵌套循环),   即首先遍历 A,将A表中的每一条记录与 B表进行连接比较,如果满足A.di=B.id,则返回记录;
        2. Merge join(合并连接), 即首先对A,B表进行排序,然后同时遍历A和B表,进行A.id=B.id的验证,直到遍历到A和B表结束;
        3. Hash join(哈希连接), 即首先对A表所有记录的id进行hash计算,最终形成一个hash表,然后join时,遍历B表,对B表每条记录的id进行hash运算,然后在A的Hash表中验证是否一致,最后得出结果。

    个人分析,SQL连接方式只是技术和SQL Server交互的连接方式。内部实现的三种算法是根据T-SQL分析并选择具体的实现算法,仅个人理解。


    -------------------------------------------------- 技术很菜却一直想做大牛!
  • 相关阅读:
    常见的行元素与块元素
    [转]SVN服务器部署并实现双机同步及禁止普通用户删除文件
    [转]Axure共享工程Shared Project(二):编辑修改和提交
    如何添加网络打印机
    [转]JSON 转换异常 死循环 There is a cycle in the hierarchy
    比较常用的Properties配置文件的使用方法示例
    解决Tomcat项目重复加载导致pemgen space内存溢出
    怎样批量删除.svn文件
    [转]前端工程师必须掌握的知识点
    Freemarker 使用
  • 原文地址:https://www.cnblogs.com/chinaboyzzy/p/4844276.html
Copyright © 2011-2022 走看看