2017-07-07 3 views
0

私はVerticaの1組の集合の交点を見つける方法とそれを行う良い方法を整理しようとしています。Verticaの集合の交点の発見

I 2セット最初のセットを持っているが大きく、単一の列テーブルに格納されている:

San Francisco 
New York 
Chicago 
London 
Rome 

第二のセットは、VARCHARフィールドで区切られた文字列として格納され、各セット1のアイテムをしない含めることができセットは、行ごとに単一の文字列エントリである私が効率的に最初のセットである第二セットのメンバーを選択されて行うことができ、その後、さらなる処理のため二組の交点を取得するために必要なもの

San Francisco,Chicago,Tampa 
Tampa,New Orleans,Miami 

2番目のセットのために私はそれを返す必要があります:

{San Francisco,Chicago} 
{} 

だから私は、それを含む行との交点のインスタンスごとに何かを行う、その後セット2Sを含むテーブルを通過し、その情報を取得できるようにする必要があります。

提案してください!

答えて

1

私はあなたが探しているものを含む表形式の出力を生成します。 JSON形式でエクスポートすることは、私の目ではフロントエンドの仕事であり、データベースの仕事ではありません。ここで

-- input 1: one city per column 
WITH city(city) AS (
      SELECT 'San Francisco' 
UNION ALL SELECT 'New York' 
UNION ALL SELECT 'Chicago' 
UNION ALL SELECT 'London' 
UNION ALL SELECT 'Rome' 
) 
, 
-- input 2: many cities per column 
cities(cities) AS (
      SELECT 'San Francisco,Chicago,Tampa' 
UNION ALL SELECT 'Tampa,New Orleans,Miami' 
) 
, 
-- end of input. Start "real" WITH clause here. 
i(i) AS (-- index for SPLIT_PART() 
      SELECT 1 
UNION ALL SELECT 2 
UNION ALL SELECT 3 
UNION ALL SELECT 4 
UNION ALL SELECT 5 
UNION ALL SELECT 6 
UNION ALL SELECT 7 
UNION ALL SELECT 8 
UNION ALL SELECT 9 
UNION ALL SELECT 10 
) 
, 
-- verticalise all those side-by-side cities, using SPLIT_PART() 
-- and the index table above 
pivot_cities AS (
    SELECT DISTINCT 
    SPLIT_PART(cities,',',i) AS city 
    FROM cities CROSS JOIN i 
) 
-- INNER JOIN input 1 with the distinct verticalised cities of input 2 
SELECT 
    city.city 
FROM city 
JOIN pivot_cities USING(city) 
; 

-- result: 
city 
------------- 
Chicago 
San Francisco 
+1

優れたソリューション!代わりに '都市選択都市、regexp_instr(cities、city)> 0;'( 'i(i)'は必要ありません)と考えることもできます。 – mauro

+0

私は1つのテーブルから情報を取り出し、それを別のテーブルに集約し、可能な限りVertica内に保持するというビジネス要件を持っています。助けてくれてありがとう!私はそれを試してみると、私はそれを動作させることができます答えを受け入れるよ! –

1

UNION ALLを使用して手動でピボットを必要としない、それを行う方法と、リスト内の最大項目の仮定数です。

はここを参照してください、と言いましたこの例では、テーブルt_cityは、列とt_citiesでシングルエントリーを有するものであるカラム内の複数のエントリを有するものである:

WITH cte_cities AS (
    SELECT id, v_txtindex.StringTokenizerDelim(cities, ',') OVER (PARTITION BY id) 
     FROM t_cities 
) 
    SELECT cte_cities.id AS cities_id, 
      cte_cities.words AS city 
     FROM cte_cities 
INNER JOIN t_city ON t_city.city = cte_cities.words 
    GROUP BY cte_cities.id, 
      cte_cities.words 
    ORDER BY cte_cities.id 

これはあなたをできるようになる、idを持つ行を返します。それらをアプリケーションのフロントエンドに集約します。カンマ区切りのリストに戻して再アセンブルする必要がある場合は、Vertica Strings Extension Packageをインストールして、探している結果が得られる関数group_concatを使用する必要があります。