2016-08-29 3 views
0

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

См. Ответ на ваш другой вопрос здесь: [link] (http://stackoverflow.com/a/39215810/2311919) – rohitvats

ответ

0

Обязательно! В 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 операция уже удаляет дубликаты, так что нет никакой необходимости, чтобы удалить дубликаты в каждом отдельном накидной подзапроса.

Смежные вопросы