Могу ли я объединить эти два запроса JOOQ в один?

У меня есть два запроса, которые просматривают отдельные таблицы базы данных и находят элементы из столбца JSONB в каждой таблице в формате ["tag1", "tag2", "tag3"] и т. д. Целью запросов является заполнение списка для предиктивного раскрывающегося списка, т. е. если список содержит «собаку» и тип пользователя «d», должна быть возвращена «собака». Каждый из этих запросов работает индивидуально, и я могу легко объединить их в один запрос 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();

person thurmc    schedule 29.08.2016    source источник
comment
См. ответ на другой вопрос здесь: ссылка   -  person rohitvats    schedule 30.08.2016


Ответы (1)


Конечно! В SQL «объединение» двух запросов в основном реализуется с помощью 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 уже удаляет дубликаты, поэтому нет необходимости удалять дубликаты в каждом отдельном подзапросе объединения.

person Lukas Eder    schedule 01.09.2016