MySQL 数据库中 left outer join 和 left join 啥区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 数据库中 left outer join 和 left join 啥区别?相关的知识,希望对你有一定的参考价值。

mysql 数据库中 left outer join 和 left join 什么区别?

left join 是left outer join的简写,left join默认是outer属性的。

Inner Join
Inner Join 逻辑运算符返回满足第一个(顶端)输入与第二个(底端)输入联接的每一行。这个和用select查询多表是一样的效果,所以很少用到;
outer join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。关键就是后面那句,返回的多一些。所以通常意义上的left join就是left outer join

在百度知道抄来的。你应该先查一下再提问
参考技术A 无区别left join 是left outer join的简写,left join默认是outer属性的。本回答被提问者采纳

如何使用 LEFT OUTER JOIN 创建 JPA 查询?

【中文标题】如何使用 LEFT OUTER JOIN 创建 JPA 查询?【英文标题】:How to create a JPA query with LEFT OUTER JOIN? 【发布时间】:2020-02-26 10:57:43 【问题描述】:

我正在学习 JPA,所以我想像这样使用 mysql 查询

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4 
FROM category AS t1 LEFT 
JOIN category AS t2 ON t2.parent = t1.category_id 
LEFT JOIN category AS t3 ON t3.parent = t2.category_id 
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ROOT'

那么如何将其更改为 jpql 查询代码? 谢谢

【问题讨论】:

How to create a JPA query with LEFT OUTER JOIN 可能重复? 我已经更新了答案,你能看看吗 【参考方案1】:

如果您使用的是 spring data jpa,您可以在存储库层中提供它,例如:

@Repository
    public interface CategoryRepository extends JpaRepository<Category, Integer> 
        @Query( value = 
        "SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4 
        FROM category AS t1
        LEFT JOIN category AS t2 ON t2.parent = t1.category_id
        LEFT JOIN category AS t3 ON t3.parent = t2.category_id 
        LEFT JOIN category AS t4 ON t4.parent = t3.category_id
        WHERE t1.name = 'ROOT'",
         nativeQuery = true)
        List<Category> fetchCategoryDataLeftJoin();

    

【讨论】:

我试了一下,但是..我得到了调试...antlr.NoViableAltException: 意外令牌:t1 @hognkun 首先你应该用DeptEmpDto(String lev1, String lev2, String lev3, String lev4)这样的构造函数创建Category实体和DeptEmpDto。然后将此代码添加到您的问题中 @hognkun 您能否分享您尝试过的代码以及堆栈跟踪。 你应该从查询中删除别名【参考方案2】:

如果您使用的是EntityManager,您可以按照这种方式进行

@PersistenceContext private EntityManager entityManager;

StringBuilder sb = new StringBuilder();

sb.append("SELECT t1.name , t2.name , t3.name , t4.name  
FROM category  t1 LEFT 
JOIN category  t2 ON t2.parent = t1.category_id 
LEFT JOIN category  t3 ON t3.parent = t2.category_id 
LEFT JOIN category  t4 ON t4.parent = t3.category_id
WHERE t1.name = :name"); // :name - you can pass parameter here 

Query q = entityManager.createQuery(sb.toString());


 q.setParameter("name", "ROOT");//Root is the value and name is the parameter 

从查询中删除别名并运行它

select t1.name , t2.name , t3.name , t4.name  
from  category  t1 left 
join category  t2 ON t2.parent = t1.category_id 
left join category  t3 ON t3.parent = t2.category_id 
left join category  t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ROOT'

【讨论】:

谢谢,但我不能使用 entityManager.. 我不知道为什么.. 所以你的答案不适合我.. 我已经更新了答案,请查看并确保从查询中删除别名 我在收到此调试消息后更改了代码.. 2019-10-31 16:45:59.279 WARN 4740 --- [main] ohengine.jdbc.spi.SqlExceptionHelper:SQL 错误:0,SQLState:S0022 2019-10-31 16:45:59.279 错误 4740 --- [main] ohengine.jdbc.spi.SqlExceptionHelper:未找到列“category_id”。 你如何改变你删除别名 您能否与您的实体核实一下,如果它存在或不存在

以上是关于MySQL 数据库中 left outer join 和 left join 啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 数据库中 left outer join 和 left join 啥区别?

关于mysql中的left join和left outer join的区别

mysql where not in to left outer join

在 MYSQL 中执行 LEFT OUTER JOIN 时插入零而不是 NULL

让 LEFT OUTER JOIN 工作的问题

MYSQL FULL OUTER JOIN - 使用 LEFT-UNION-LEFT JOIN 时的所有 NULL 结果