2016-06-20 15 views
1

このクエリで少し苦労しています。おそらく誰かが私にヒントを与えることができますか?再帰的検索のSQLクエリ構造の例

私の設定は、3つのテーブル(アクター、ムービー、リレーション)から構成されています。私がしたいことは次のとおりです:

Person1と一緒に映画で再生されるAで始まるすべてのアクターを検索します。

SELECT Name 
FROM Actors a, Movies m, Relations r 
WHERE a.Name='A%' 
AND Person1.keyPerson = m.KeyPerson 
AND m.KeyMovies .... 

例をいいだろう継続する方法について:私が得たどのくらいです

UPADATE - 表には、次のようになります。

俳優(actorsID、名) 映画(moviesID、タイトル) リレーションズ(actorsID、moviesID)

+0

してください表の構造を提供する。あなたは「関係」のために何も提供していません。 – trincot

+0

テーブルの構造を示してください。私はこれらのテーブルが互いにどのように関連しているのか理解できません。 – Siyual

+0

アクター間の5つの内部結合を使用して、ムービーとの関係をr2に変換し、アクターa2にムービーを関連付けることができます。または、あなたが存在する場所をEXISTS(選択肢を使って)...または...たくさんの組み合わせにすることができます。テストデータと期待される結果をここに試してみてください。テーブルの主キー! – Matt

答えて

1

あなたがこれを行うことができますいくつかの方法があります - 一つの方法をINステートメントを使用して、Person1の映画を引っ張ってA%人の映画をチェックすることができます。

Select Distinct A.Name 
From Actors  A 
Join Relations R On R.ActorId = A.ActorId 
Where A.Name Like 'A%' 
And  R.MovieId In 
(
    Select R2.MovieId 
    From Actors  A2 
    Join Relations R2 On R2.ActorId = A2.ActorId 
    Where A2.Name = 'Person1' 
) 

もう一つの方法は、EXISTS声明を経由しているPerson1はそのA%にされているすべての映画を探しても、されてきた:サブクエリなし

Select A.Name 
From Actors  A 
Join Relations R On R.ActorId = A.ActorId 
Where A.Name Like 'A%' 
And Exists 
(
    Select * 
    From Movies  M2 
    Join Relations R2 On R2.MovieId = M2.MovieId 
    Join Actors  A2 On R2.ActorId = R2.ActorId 
    Where A2.Name = 'Person1' 
    And  M2.MovieId = R.MovieId 
) 
+0

ありがとうございます - 私はそれを試みます –

0

ソリューション:

SELECT  DISTINCT a.Name 
FROM  Actors a 
INNER JOIN Relations r 
     ON r.actorsID = a.actorsID 
INNER JOIN Relations r2 
     ON r.moviesID = r2.moviesID 
INNER JOIN Actors a2 
     ON a2.actorsID = r2.actorsID 
     AND a2.Name = 'Person1' 
WHERE  a.Name LIKE 'A%'