我是SQL的新手,我在编写这个SQL查询时需要一些帮助。
我有一个这样的电影表:
Movie_id Actor_name Director_name
1 a AA
1 b AA
2 b BB
2 d BB
现在我想打印出所有没有互相合作的演员和导演 - 例如在这种情况下它会打印出来(a,BB)和(d,AA)
答案 0 :(得分: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
条件)。 / p>
答案 1 :(得分:1)
我会首先通过交叉连接(即Cartesian product)开发所有演员和导演对,然后使用观察到的关系表过滤掉这个列表。
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的小提琴中解脱出来的,因为他打败了我。)
答案 2 :(得分: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。
答案 3 :(得分: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)))