2013-08-09 19 views
9

私はSQLにはとても慣れていないので、このSQLクエリを書く上で助けが必要でした。MySQL - この文書を書くにはどのようにすればよいですか?

私はこのような映画のテーブルを持っている:

Movie_id Actor_name Director_name 
1   a    AA 
1   b    AA 
2   b    BB 
2   d    BB 

は今はお互いに働いていない俳優と監督のすべてのペアをプリントアウトしたい - 例えば、この場合には、それは(プリントアウトされます

SELECT a.Actor_name, d.Director_name 
FROM (
    (SELECT DISTINCT Actor_name from movie) a 
    CROSS JOIN 
    (SELECT DISTINCT Director_name from movie) d 
) WHERE NOT EXISTS (
    SELECT * FROM movie m 
    WHERE m.Actor_name=a.Actor_name 
    AND m.Director_name=d.Director_name 
) 

アイデアは俳優と監督のすべての可能なペアを生成することである(デカルト積の真ん中に参加:これは次のように、BB)と(d、AA)

答えて

2

は、あなたはそれを行うことができますクエリ)、t映画を介して接続されているペアを除外するために結果をフィルタリングします(NOT EXISTS条件)。ここ

は、私が最初に(すなわちCartesian product)参加クロスで俳優及び監督のすべての対を開発することによってこれを行うであろうdemo on sqlfiddle.

1

され、その後、観測関係のテーブルを使用して、このリストを絞り込みます。

SELECT * 
FROM (
    -- cross join 
    SELECT a.actor_name, d.director_name 
    FROM (SELECT DISTINCT actor_name FROM movies) a 
    ,(SELECT DISTINCT director_name FROM movies) d 
    ) pairs 
WHERE NOT EXISTS (
    SELECT 1 FROM movies m 
    WHERE pairs.actor_name = m.actor_name 
    AND pairs.director_name = m.director_name 
    ) 

SQLFiddle Demo(彼はそれに私を打つため、基本的にdasblinkenlightのフィドルから清掃スキーマ)。

1

1つの代替:

select distinct t1.actor_name, t2.director_name from t t1, t t2 
where (t1.actor_name, t2.director_name) not in (
    select actor_name, director_name from t) 

フィドルhere

別の方法:

select distinct t1.actor_name, t2.director_name from t t1 
cross join t t2 left join t t3 
on t1.actor_name = t3.actor_name and t2.director_name = t3.director_name 
where t3.actor_name is null 

フィドルhere

+1

あなたの最初のものは、最も簡単なものです。私はそれが好きです :) – Franco

0

はまた、(前回の回答でいくつかの違いで)直積に基づく:

select distinct m.Actor_name, mo.Director_name 
from movie m 
cross join movie mo 
where (not exists (select mv.Actor_name, mv.Director_name 
        from movie mv 
        where (mv.Actor_name = m.Actor_name and mv.Director_name = mo.Director_name))) 

Fiddle

関連する問題