簡體   English   中英

Jooq- 左內連接

[英]Jooq- Left inner join

我試圖查詢我的 task_template 表,其中 task_Template.id.in(1,4) 與任務表上的內部聯接,其中 task.task_Template_id.eq(task_template.id)。 所以我想返回 id 為 1 或 4 的所有模板行,以及該模板的任務(如果存在)。

我的數據庫中有兩個模板,其中一項任務的 task_template_id 為 1。

所以我試圖返回兩個模板,其中任務將在一個模板中為空,而在另一個模板中填充。

但是我的查詢似乎正在執行內部連接並且只返回一個結果?

    var query =
    dsl.select(TASK_TEMPLATE.fields())
        .select(TASK.fields())
        .from(TASK_TEMPLATE)
        .leftJoin(TASK)
        .on(TASK_TEMPLATE.ID.eq(TASK.TASK_TEMPLATE_ID))
        .where(TASK_TEMPLATE.TENANT.eq(TenantContext.getCurrentTenant()))
            .and(TASK_TEMPLATE.ID.in(rootTemplateIds))
        .and(TASK.ENTITY_NAME.eq(entityName))
        .and(TASK.ENTITY_ID.eq(entityId))
        .and(TASK.DELETED.eq(Boolean.FALSE))
        .orderBy(TASK.ORDER.asc().nullsLast());

左連接時不能在TASK表上寫這樣的謂詞,否則效果將是左連接變成內連接。 這可以通過示例顯示:

TASK_TEMPLATE

+----+--------+
| ID | TENANT |
+----+--------+
|  1 | A      |
|  2 | B      |
+----+--------+

任務

+----------------+-------------+
| TASK_TENANT_ID | ENTITY_NAME |
+----------------+-------------+
|              1 | X           |
+----------------+-------------+

LEFT JOIN后的結果將是

+----+--------+----------------+-------------+
| ID | TENANT | TASK_TENANT_ID | ENTITY_NAME |
+----+--------+----------------+-------------+
|  1 | A      |              1 | X           |
|  2 | B      |                |             |
+----+--------+----------------+-------------+

現在,如果您對ENTITY_NAME (和其他字段)進行過濾,在您的LEFT JOIN之后它可能為NULL ,那么您將獲得與首先將內部加入它們相同的效果。 您不能從WHERE子句中的LEFT JOIN表中過濾列。

也許,您打算在ON子句中過濾它們(作為LEFT JOIN操作的一部分):

var query =
dsl.select(TASK_TEMPLATE.fields())
    .select(TASK.fields())
    .from(TASK_TEMPLATE)
    .leftJoin(TASK)
    .on(TASK_TEMPLATE.ID.eq(TASK.TASK_TEMPLATE_ID))
    // Move these here
    .and(TASK.ENTITY_NAME.eq(entityName))
    .and(TASK.ENTITY_ID.eq(entityId))
    .and(TASK.DELETED.eq(Boolean.FALSE))
    .where(TASK_TEMPLATE.TENANT.eq(TenantContext.getCurrentTenant()))
        .and(TASK_TEMPLATE.ID.in(rootTemplateIds))
    // Remove them from here
    // .and(TASK.ENTITY_NAME.eq(entityName))
    // .and(TASK.ENTITY_ID.eq(entityId))
    // .and(TASK.DELETED.eq(Boolean.FALSE))
    .orderBy(TASK.ORDER.asc().nullsLast());

我還在這篇博文中討論了ONWHERE子句之間的區別

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM