Inner Join WITH和内部联接ON有什么区别?

时间:2014-04-11 22:31:06

标签: php mysql sql symfony doctrine-orm

阅读Doctrine 2 Documentation at this page时,我可以看到他们有2种方法来指定内连接的条件:

// Example - $qb->expr()->innerJoin('u.Group', 'g', Expr\Join::WITH, 'g.manager_level = 100');
// Example - $qb->expr()->innerJoin('u.Group', 'g', 'WITH', $qb->expr()->eq('g.manager_level', '100'));
public function innerJoin($join, $alias, $conditionType = null, $condition = null); // Returns Expr\Join instance

// Example - $qb->innerJoin('u.Group', 'g', Expr\Join::ON, $qb->expr()->and($qb->expr()->eq('u.group_id', 'g.id'), 'g.name = ?1'))
// Example - $qb->innerJoin('u.Group', 'g', 'ON', 'u.group_id = g.id AND g.name = ?1')
public function innerJoin($join, $alias = null, $conditionType = null, $condition = null);

我不明白其中的区别,因为只有当内部连接找到匹配项时才会返回内容,我无法找到有关此内容的任何文档。

由于

2 个答案:

答案 0 :(得分:1)

看起来他们是同义词。基于Doctrine EBNF表达式(在http://docs.doctrine-project.org/en/2.0.x/reference/dql-doctrine-query-language.html#from-join-and-index-by处找到),似乎Doctrine更喜欢WITH。但是,MySQL(可能还有其他SQL数据库)使用ON,所以我的猜测是Doctrine的作者包含了这个表达式以避免混淆用户。

Doctrine的开发人员编写了他们自己的SQL变体 - 这是因为Doctrine是一个对象关系管理器(ORM),而不是一个直接的查询构建器。他们的SQL变体旨在使用它们的对象。因此,例如,如果您正在构建usergroup模型并希望表达它们之间的关系,您可以使用Doctrine的查询语言来完成它,它将处理{{1}条件自动化。

答案 1 :(得分:-1)

我喜欢这个解释:

  如果您在使用单词JOIN时未指定类型,

INNER JOIN是默认值。

     

您也可以使用LEFT OUTER JOIN或RIGHT OUTER JOIN,在这种情况下,单词OUTER是可选的,或者>您可以指定CROSS JOIN。