我对 SQL 很陌生,在编写这个 SQL 查询时我需要一些帮助。
我有一个像这样的电影表:
Movie_id Actor_name Director_name
1 a AA
1 b AA
2 b BB
2 d BB
现在我想打印出所有没有合作过的演员和导演对 - 例如在这种情况下它将打印出 (a,BB) 和 (d,AA)
你可以这样做:
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
条件)。
一种选择:
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
在这里拉小提琴。
我将首先通过交叉连接(即笛卡尔积)开发所有演员和导演对,然后使用观察到的关系表过滤此列表。
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 的小提琴中清除的,因为他打败了我)。
同样基于笛卡尔积(与之前的回复有一些差异):
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)))