zoukankan      html  css  js  c++  java
  • TSQL之条件链接

    --演示数据
    IF OBJECT_ID('tempdb..#A') IS NOT NULL
        DROP TABLE #A
    GO
    
    CREATE TABLE #A (
    A_ID INT,
    A_COL INT
    )
    
    INSERT  #A
    SELECT 1 , 1 UNION ALL
    SELECT 2 , NULL UNION ALL
    SELECT 3 , 1 UNION ALL
    SELECT 3 , 2 UNION ALL
    SELECT 4 , 1
    
    
    IF OBJECT_ID('tempdb..#B') IS NOT NULL
        DROP TABLE #A
    GO
    CREATE TABLE #B(
    B_ID INT , B_COL INT
    )
    INSERT INTO #B
    SELECT 1, 1 UNION ALL
    SELECT 2 , NULL UNION ALL
    SELECT NULL ,1 
    
    
    /*
    1、    JOIN (INNER JOIN)   INNER 可以省略
        将一个表中的记录和另一个表中的记录的对应记录进行匹配,前提是两个表的相关列包含相同的值。
        如果其中一个表的列值不同,或者根本没有值,查询将不会返回这些行。    
        既先对两表进行笛卡尔积 然后根据ON进行条件筛选
        同FROM A,B WHERE A.ID = B.ID 即为等值连接                                                */
    --INNER JOIN 
    SELECT * FROM #A AS A INNER JOIN #B AS B ON A.A_ID = B.B_ID
    --下面两个查询结果是没有区别的
    SELECT * FROM #A AS A INNER JOIN #B AS B ON A.A_ID = B.B_ID AND A.A_COL = 1 
    SELECT * FROM #A AS A INNER JOIN #B AS B ON A.A_ID = B.B_ID WHERE A.A_COL = 1     
        
    /*
    2、    LEFT JOIN   (LEFT OUTER JOIN )
        左向外联接的结果集包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。
        如果左表的某行在右表中没有匹配行,则在相关联的结果集中右表的所有选择列表均为空值        */
        
    --LEFT JOIN
    SELECT * FROM #A AS A LEFT JOIN #B AS B ON A.A_ID = B.B_ID
    SELECT * FROM #A AS A LEFT JOIN #B AS B ON A.A_COL = 1 --即把1的进行CROSS JOIN 非1的加上
    --以下两个语句的区别
    SELECT * FROM #A AS A LEFT JOIN #B AS B ON A.A_COL = 1 
    WHERE B.B_COL = 1     
    SELECT * FROM #A AS A LEFT JOIN #B AS B ON A.A_COL = 1 
    AND B.B_COL = 1     
    
    
    
    /*
    3、    RIGHT JOIN  (RIGHT OUTER JOIN )
        右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左右返回空值。    */
    --RIGHT JOIN 
    SELECT * FROM #A AS A RIGHT JOIN #B AS B ON A.A_ID = B.B_ID
    SELECT * FROM #A AS A RIGHT JOIN #B AS B ON A.A_ID = B.B_ID AND A.A_COL = 1 
    SELECT * FROM #A AS A RIGHT JOIN #B AS B ON A.A_ID = B.B_ID AND A.A_COL = 1
    WHERE B.B_COL <> 1 
    SELECT * FROM #A AS A RIGHT JOIN #B AS B ON A.A_COL = 1 
    
    
    /* 
    4、    完整外部联接(FULL JOIN 或者 FULL OUTER JOIN)
        完整外部联接返回左右和右表中的所有行,当某行的在另一个表中没有匹配行时,则另一个表的选择列表包含空值。
        如果表之间有匹配行,则整个结果集行包含基表的数据值。        
        对于完整外部联接,可以这样理解它的输出结果:先生成LEFT JOIN 的结果,将表B中所有未出现在结果中的行添加到结果集中,
        对于添加到结果集中的第一行,应该出现表A列值的地方用NULL代替                                    */
        SELECT * FROM #A AS A FULL JOIN  #B AS B ON A.A_ID = B.B_ID
        SELECT * FROM #A AS A FULL JOIN  #B AS B ON A.A_ID = 1
    
    /*
    5、交叉联接(CROSS JOIN )
    交叉联接返回左表中的所有行,左表中的第一行与右表中的所有行组合。交叉联接也称为笛卡尔积            */
    
    --CROSS JOIN 
    SELECT * FROM #A AS A CROSS JOIN #B AS B 
  • 相关阅读:
    Spring bean的循环依赖以及解决方式
    在Java中为什么实现了Cloneable接口,就能调用Object的clone方法?
    Java-Objects类-deepEquals()和equals()详解
    Linux TCP状态TIME_WAIT 过多的处理
    mysql字符串区分大小写的问题
    java 类加载
    java native 理解
    Maven配置阿里镜像仓库
    Cannot find name ‘XX‘. Do you need to change your target library? Try changing the `lib` compiler
    Typescript Interfaces(接口)添加任意key值/内容
  • 原文地址:https://www.cnblogs.com/zerocc/p/2815802.html
Copyright © 2011-2022 走看看