【问题标题】:SQL Query OneToMany Filtering with child entity but returning parentSQL查询OneToMany过滤与子实体但返回父
【发布时间】:2021-09-15 23:37:01
【问题描述】:

嘿,我需要一些关于我无法弄清楚的 SQL 查询的帮助。 我得到了这两个具有 OneToMany/ManyToOne 关系的表:

create table Author (
"UUID" RAW(16) DEFAULT NULL NOT NULL ENABLE,
"name" VARCHAR2(255 CHAR) NOT NULL ENABLE,
"processed" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
CONSTRAINT "Author_P" PRIMARY KEY ("UUID"),
)

create table Book (
"UUID" RAW(16) DEFAULT NULL NOT NULL ENABLE, 
"name" VARCHAR2(255 CHAR) NOT NULL ENABLE,
"release" TIMESTAMP(6),
"AUTHOR_ID" RAW(16) NOT NULL,
 CONSTRAINT Book_P PRIMARY KEY (UUID),
        CONSTRAINT Book_F FOREIGN KEY (KAFKA_BEZIEHUNG_ID) REFERENCES "Author" ("UUID")
)

现在我得到了这个选择查询来获取当前日期之前写的所有书籍:

(我在 Java JPA 中通过 Query Annotation 执行此操作)

@Query(Select b from Book b where b.release < current_timestamp)
List<Book> findAllBooksBeforeToday();

在这种情况下,我将归还所有书籍,但我的替代品是:

  1. 只返回作者,没有重复
  2. 另外,我只想返回“已处理”值为 false 的作者。

我可以通过这样做或至少我认为但那不是很有效:

@Query(Select b.author_id from Book b where b.release < current_timestamp)
HashSet<Author> findAllBooksBeforeToday();

第二个条件很简单:

@Query(Select a from author a where a.processed = false)

所以我现在的问题是,我如何甚至可以将这两个查询组合到一个查询中,该查询从 book 表中进行选择,但只返回已处理的作者 = false?

【问题讨论】:

    标签: java sql oracle spring-data-jpa


    【解决方案1】:

    我假设 Book.AUTHOR_ID 与 Author.UUID 匹配

    select distinct b.author_id 
    from Book b inner join Author a on a.UUID = b.AUTHOR_ID
    where a.processed = 0 and b.release < current_timestamp
    

    【讨论】:

    • 完美。正是我想要的。谢谢!我唯一改变的是“选择不同的 b”而不是“b.author_id”,因为我想要完整的实体而不仅仅是 id。
    【解决方案2】:

    我不懂 Java,但是 - 做你想做的事(至少,我是怎么理解的)的查询是

    -- distinct authors (i.e. no duplicates)
    select distinct a.name
    from author a;
    
    -- "false" processed authors
    select distinct a.name
    from author a
    where a.processed = 0;
    
    -- join books and "false" processed authors
    select b.name as book_name,
           a.name as author_name
    from book b join author a on a.uuid = b.uuid
    where a.processed = 0;        
    

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2022-06-29
      • 1970-01-01
      相关资源
      最近更新 更多