2016-08-29 5 views
0

별도의 데이터베이스 테이블을보고 [ "tag1", "tag2", "tag3"] 등의 형식으로 된 각 테이블의 JSONB 열에서 항목을 찾는 두 가지 쿼리가 있습니다. 쿼리의 목적은 예를 들어 목록에 "dog"가 포함되어 있고 사용자가 "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은 중복을 유지하려고 함을 나타냄). UNION 작업이 이미 중복을 제거하기 때문에, 내가 select()으로 selectDistinct()를 교체 한

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(); 

주, 각각의 개별 노조 하위 쿼리에서 중복을 제거 할 필요가 없습니다 : 귀하의 경우, 다음과 같은 물품.

관련 문제