sql – LEFT JOIN(OUTER JOIN)与INNER JOIN的条件

前端之家收集整理的这篇文章主要介绍了sql – LEFT JOIN(OUTER JOIN)与INNER JOIN的条件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
SELECT A.COL1,B.COL1,C.COL1
FROM TABLEA A
LEFT JOIN TABLEB B ON A.COL1 = B.COL1
LEFT JOIN TABLEC C ON (
        C.COL3 IS NOT NULL
        AND (
              C.COL2 = 664
              AND A.COL1 = C.COL1
        )
)

关于sql的技术性,在LEFT JOIN TABLE C ON之后用括号写的条件是什么意思?为什么那些必要?

解决方法

内连接(JOIN或INNER JOIN,CROSS JOIN或逗号)首先执行CROSS JOIN. (即返回所有可以通过从左表中追加一行并从右表中追加一行来生成的行.)然后任何ON都会删除不符合其条件的行.对于左表(LEFT)或右表(RIGHT)或两个表(FULL),OUTER JOIN返回相应的INNER JOIN加的行,任何用NULL扩展的不匹配行. FROM a WHERE删除不符合其条件的行.

如果条件处于ON状态,则在FROM中删除匹配的行.但是,如果该条件改为在WHERE中,则匹配的行和通过后续连接合并它们的任何行仍然会被删除.因此,如果FROM仅具有内部联接,则条件是在ON还是在WHERE中无关紧要.

但是如果FROM在一个条件上有一个OUTER JOIN,则删除不满足条件的交叉连接行,并添加某些NULL扩展行,而将该条件移动到WHERE则删除但不添加.

对于INNER JOIN,语言没有必要为ON而不是t1 INNER JOIN t2 ON条件可能涉及(SELECT * FROM t1 INNER JOIN t2 WHERE条件).

从上面你可以得出以下结论:对于任何最后一次OUTER JOIN之后的一系列INNER JOINS(包括没有OUTER JOIN时),可以在它们的ON和WHERE之间自由移动条件.但不适用于任何最后一次OUTER JOIN之前或之前的ON,因为它们会影响其输入,从而影响输出的NULLed行.如果将这样的条件从ON移动到WHERE,则没有理由期望相同的结果.

对于你的代码:可能查询被设计为返回A.COL1作为具有关联的A,B和C信息的id,但是那些没有包含B信息的那些(B& C信息为NULL)和那些做的但是没有C信息或没有但是没有非NULL C.COL3或者但是没有C.COL2 = 664但是包含了(C信息为NULL).

猜你在找的MsSQL相关文章