9

私は SQL に非常に慣れていないので、この SQL クエリを作成する際に助けが必要でした。

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

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

ここで、お互いに仕事をしたことのない俳優と監督のすべてのペアを出力したいと思います。たとえば、この場合、(a,BB) と (d,AA) が出力されます。

4

4 に答える 4

2

次のように実行できます。

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
)

アイデアは、俳優と監督のすべての可能なペアを生成し (デカルト積はクエリの途中で結合します)、その結果をフィルタリングして、映画 (NOT EXISTS条件) を介して接続されたペアを除外することです。

これはsqlfiddleのデモです。

于 2013-08-09T00:28:24.363 に答える
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 のフィドルから拾ってきたものです)。

于 2013-08-09T00:29:28.077 に答える
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)))

フィドル

于 2013-08-09T01:43:46.753 に答える