2017-06-12 20 views
0

私はAmazon Redshiftを使用しており、クエリを正しく取得できません。それぞれに1つ以上のスキルが必要な多くのプロジェクトがあるとします。だからプロジェクトとスキルの間に多対多の関係があります。ユーザーはプロジェクトを作成するので、プロジェクトごとに1人の作成者がいます。存在多対多関係

プロジェクトごとに、少なくとも1つのスキルを共有する同じクリエーターが他のプロジェクトをすべて取得したいと考えています。だから私はこのような何かを書きたいのですが:

SELECT p1.project_id, p2.project_id 
FROM projects p1 
JOIN projects p2 on p1.creator = p2.creator 
WHERE EXISTS (SELECT 0 
       from skills sk1, skills sk2 
       where sk1.project_id = p1.project_id 
       and sk2.project_id = p2.project_id 
       and sk1.skill = sk2.skill) 

問題は、これが(disk fullエラーになります)実際にあるということです。

以下の作品が、また、本当に遅いですが(時間半ほどかかります):

この1と
SELECT distinct p1.project_id, p2.project_id 
FROM projects p1 
    JOIN projects p2 on p1.creator = p2.creator 
    join skills sk1 on sk1.project_id = p1.project_id 
    join skills sk2 on sk2.project_id = p2.project_id 
WHERE sk1.skill = sk2.skill 

問題は、私は2番目のプロジェクトにいくつかのプロパティを集約したい場合は、私が持っているということですサブクエリとして使用します。

これを行うより良い方法はありますか?私は最初のクエリがより速くなると思っていました。なぜなら、単一のプロジェクトを選ぶことが止まってからです。

+0

あなたが結合列上の任意のインデックスのセットアップを持っていますか? –

答えて

1

質問には、プロジェクトを自分自身に参加させるという単純な問題があります。つまり、すべてのプロジェクトが返されます。接合される2つのプロジェクトを確保し

修正それは同じではありません。私は、2つのマッチングプロジェクトが一方向にのみ参加するよう>なく!=を使用

JOIN projects p2 on 
    p1.creator = p2.creator and 
    p2.project_id > p1.project_id 

注意。そうしないと、プロジェクトの各ペアが2回返されます。

ご参加ベースのソリューションは、このようなものになるだろう:

SELECT distinct p1.project_id, p2.project_id 
    FROM projects p1 
    JOIN projects p2 on 
     p1.creator = p2.creator and 
     p2.project_id > p1.project_id 
    join skills sk1 on 
     sk1.project_id = p1.project_id 
    join skills sk2 on 
     sk2.project_id = p2.project_id and 
     sk1.skill = sk2.skill