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 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)

在这里拉小提琴。

另一种选择:

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

在这里拉小提琴。

于 2013-08-09T01:09:54.513 回答
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 回答