SQL Server外连接

时间:2015-09-17 18:15:01

标签: sql sql-server

在进行外连接时,是重要的表的顺序还是ON子句的顺序?

例如是

FROM TABLEA A 
LEFT JOIN TABLEB B ON A.id = B.id

相同
FROM TABLEA A 
LEFT JOIN TABLEB B ON B.id = A.id

如果你有多张桌子怎么样?如果许多中的第一个表是您想要的所有行而不管LEFT JOIN子句,那么它是ON吗?

例如,

FROM TABLEA A 
LEFT JOIN TABLEB B ON A.id = B.id 
LEFT JOIN TABLEC C ON C.ID = A.ID

它是否需要来自TABLEA的所有行,因为它位于表格列表的左侧或来自C的行,因为它位于ON子句的左侧?< / p>

2 个答案:

答案 0 :(得分:1)

// trying to access a file directly? if ($is_file) { // TODO: manage served files (gzip, minify, etc.) // is it an allowed extension? if (!is_array($CONFIG['allow_ext_access']) || !in_array($type, $CONFIG['allow_ext_access'])) die('access denied'); // it's not *this* file is it? if (!$is_index) { // try to get known file type $file_type = isset($CONFIG['file_types'][$type]) ? $CONFIG['file_types'][$type] : false; // if we have a file type we can properly pass it as what it is if ($file_type) { header('Content-Type: '.$file_type['mime']); } // execute php file or just output any other file if ($type == 'php') @include($path); else @readfile($path); die; } } // if it's not this file, then it's a path and a URL for re-routing 表示取左侧的表(指定的第一个表),并连接右表(指定的第二个)中的行。它会根据LEFT JOIN条件ON加入他们。由于true条件只需要ON,因此它的编写方式根本不重要,它只是一个被评估的表达式。

true确保左侧表格中的每一行都会被保留,如果没有行可以从右侧的表格中加入LEFT JOIN,则会与NULL联接。这意味着表的顺序肯定很重要。

如果表格顺序颠倒了,并且只有两个表格,则RIGHT JOIN会产生相同的效果(即保留指定的第二个表格中的行)。

答案 1 :(得分:0)

FROM TABLEA A LEFT JOIN TABLEB B ON A.id=B.id LEFT JOIN TABLEC C ON C.ID=A.ID

FROM TABLEA A LEFT JOIN TABLEB B ON B.id=A.id LEFT JOIN TABLEC C ON A.ID=C.ID

这两者都会返回相同的结果。

FROM TABLEA A LEFT JOIN TABLEB B ON B.id=A.id LEFT JOIN TABLEC C ON B.ID=C.ID

这可能会也可能不会返回相同的结果,具体取决于表b和表C中实际存在的数据,因为表C与表b没有直接关系到表A.我个人总是把它视为不同的定义而不是第一组连接,如果是在同一时间是偶然的。

当编写多个连接时,特别是当你有外连接时,我个人觉得首先从父表开始(通常是你想要的在连接的左边)并添加任何其他内连接表是有帮助的在做左连接之前。如果我有子孙表(副多子表),那么我会尝试按父母,子女,孙子的降序排列,以明确与什么有关。