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). (编辑:应用网_常德站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – 如何对服务器上的所有数据库执行SQL
- 数据库设计 – 在SQL中实现与多个参与约束的多对多关系
- sql-server-2000 – 如何从PHP 5.3及更高版本连接到MSSQL 2
- sql-server – 如何在DST之前或之后的日期获得UTC与本地时间
- sql – Postgres连接表的唯一多列索引
- 带有last_insert_id()的Mysql多行插入 – 选择语句
- HTML table行距的改变方法示例
- SQL Server:只有GROUP BY中的最后一个条目
- sql-server – 可以改善SQL Server的崩溃恢复能力吗?
- 用于.Net项目的文档数据库/键值存储