我可以将这两个JOOQ查询合并为一个吗?

时间:2016-08-29 20:58:48

标签: sql postgresql jooq postgresql-9.5

我有两个查询,它们查看单独的数据库表,并从每个表中的JSONB列中查找格式为[“tag1”,“tag2”,“tag3”]等的项目。查询的目的是填充预测下拉列表,即如果列表包含“dog”且用户键入“d”,则应返回“dog”。这些查询中的每一个都是单独工作的,我可以轻松地将它们组合成一个JOOQ查询?

    final Field<String> value = field(name("A", "value"), String.class);

    final Result<Record1<String>> res1 = sql.dsl()
            .selectDistinct(value)
            .from(CAMPAIGN,lateral(table("jsonb_array_elements_text({0})", CAMPAIGN.TAGS)).as("A"))
            .where(CAMPAIGN.STORE_KEY.equal(campaign.getStoreKey()))
            .and(CAMPAIGN.CAMPAIGN_KEY.notEqual(campaignKey))
            .and(value.like(search + "%%"))
            .fetch();

    final Result<Record1<String>> res2 = sql.dsl()
            .selectDistinct(value)
            .from(STOREFRONT, lateral(table("jsonb_array_elements_text({0})", STOREFRONT.TAGS)).as("A"))
            .where(STOREFRONT.STORE_KEY.equal(campaign.getStoreKey()))
            .and(value.like(search + "%%")).fetch();

1 个答案:

答案 0 :(得分:0)

当然!在SQL中,&#34;结合&#34;两个查询主要使用UNION [ ALL ]实现(其中ALL表示您要保留重复项)。在您的情况下,请写下以下内容:

final Result<Record1<String>> result = 
sql.dsl()
   .select(value)
   .from(
        CAMPAIGN,
        lateral(table("jsonb_array_elements_text({0})", CAMPAIGN.TAGS)).as("A"))
   .where(CAMPAIGN.STORE_KEY.equal(campaign.getStoreKey()))
   .and(CAMPAIGN.CAMPAIGN_KEY.notEqual(campaignKey))
   .and(value.like(search + "%%"))
   .union(
    select(value)
   .from(
        STOREFRONT, 
        lateral(table("jsonb_array_elements_text({0})", STOREFRONT.TAGS)).as("A"))
   .where(STOREFRONT.STORE_KEY.equal(campaign.getStoreKey()))
   .and(value.like(search + "%%")))
   .fetch();

请注意,我已将selectDistinct()替换为select(),因为UNION操作已删除重复项,因此无需删除每个联合子查询中的重复项。< / p>