当前位置: 首页 > 知识库问答 >
问题:

右表对象不存在时如何处理左外连接结果

陶睿
2023-03-14

db架构包含表AUTHOR和BOOK,列如下:

AUTHOR: author_id, name
BOOK: book_id, name, author_id
public class Author { int author_id; String name; }
public class Book { int book_id; String name; }
Result<Record> records = ctx.select()
            .from(AUTHOR)
            .leftOuterJoin(BOOK)
            .on(AUTHOR.AUTHOR_ID.eq(BOOK.AUTHOR_ID))
            .fetch();
Author author = records.get(0).into(Author.class);
Book book = records.get(0).into(Book.class);

问题是,book对象在没有作者的书时用默认值填充。如何检测左联接没有右表的对象?一种方法是检查图书主键字段是否为空。还有别的办法吗?

共有1个答案

章绪
2023-03-14

在对象模型想要表达的内容和SQL能够产生的内容之间存在概念上的不匹配。在对象模型中,人们喜欢将关系建模为嵌套集合,例如:

Author {
    List<Book> books;
}

而在RDBMS中,人们以相反的方式建模关系,在子实体上使用外键:

CREATE TABLE book (
    author_id bigint REFERENCES author(id)
)

从SQL生成嵌套集合(在对象模型中)的最直接的方法是使用SQL标准中指定的multiset运算符:

SELECT
  author.*,
  MULTISET(
    SELECT * FROM book WHERE book.author_id = author.id
  ) AS books
FROM author;
    null

在上述方法中,最好的方法之一可能是“每个实体的新查询”方法,在这种方法中,首先获取所有作者,然后在2个查询中获取每个作者的所有书籍(而不是在N+1个查询中!):

SELECT * FROM author WHERE [ some predicate ]
SELECT * FROM book WHERE author_id IN (SELECT id FROM author WHERE [ some predicate ])

然后,您可以使用jOOQ实现每个结果,并使用hashmaps在Java内存中匹配作者和书籍。

 类似资料:
  • 问题内容: 我已经尝试解决这个问题一段时间了,希望有人能帮助我。我有两个桌子,第一个桌子是 表名:OnlineTest 第二张表是 表名称:UserStatus 结果 我已经试过这个查询, 但是此查询将带出结果的前两行,而不是最后两行,其中userId和status为null。 如何带来以上结果? 问题答案: 将谓词放在子句中: 这将返回的所有行,其中谓词失败的列填充为。

  • LEFT OUTER JOIN 左外连接 [ ] 需求:查询所有分类,如果该分类下没有商品,则不显示该分类 [ ] 实现: SELECT `goods`.`id`, `goods`.`title`, `goods`.`price`, `goods`.`cate_id`, `cate`.`id`, `cate`, `cate.title` F

  • 如何在中实现或。一个简单的例子很有帮助。

  • 本文向大家介绍说下左连接和右连接相关面试题,主要包含被问及说下左连接和右连接时的应答技巧和注意事项,需要的朋友参考一下 比如有两张表 A,B。左连接是把符合条件的所有A表的内容列出来,B表如果没有内容匹配用NULL代替。 右连接是符合条件的所有B表的内容列出来,A表如果没有内容匹配用NULL代替

  • 问题内容: 当我想使用get()函数选择对象时 如果get函数不返回查找值,则“不存在匹配查询”。发生错误。 如果我不需要此错误,我将使用try和except函数 但是我认为这不是自使用以来最好的方法 请推荐一些想法或代码示例来解决此问题 问题答案: 这取决于你不存在时要执行的操作。 那里get_object_or_404: 在给定的模型管理器上调用get(),但是它引发Http404而不是模型的

  • 问题内容: 根据我对左外部联接的了解,结果表的行数永远不应超过左表的行数…如果这是错误的,请让我知道… 我的左表是192572行和8列。 我的右边表格是42160行和5列。 我的左表有一个名为“ id”的字段,该字段与我的右表中名为“键”的一列匹配。 因此,我将它们合并为: 但是组合的形状是236569。 我有什么误会? 问题答案: 如果键与另一个DataFrame中的多个行匹配,则可以预期这种情