2016-08-29 6 views
0

私は別のデータベーステーブルを見て、["tag1"、 "tag2"、 "tag3"]の形式の各テーブルのJSONB列から項目を見つけます。クエリの目的は、予測ドロップダウンのリスト、つまりリストに「dog」が含まれ、ユーザーが「d」を入力した場合は「dog」が返されます。これらのクエリはそれぞれ個別に動作し、それらを1つのJOOQクエリに簡単に組み合わせることができます。これらの2つのJOOQクエリを1つにまとめることはできますか?

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では、2つのクエリを「結合する」のはほとんどが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(); 

注:お使いの場合には、次のように記述します。

関連する問題