Sql 联接表中的选定语句
Sql 联接表中的选定语句,sql,sql-server,Sql,Sql Server,电影: id ,title,yr,director,budget,gross actor: id,name 铸造: movieid,actorid,ord 我有一个问题,我一直在问(列出所有1962年电影的电影以及主角)。[注:演员的ord字段给出了演员的位置。如果ord=1,则该演员是主演] 我的回答是: select title, name from movie join casting on movie.id = casting.m
电影
:
id ,title,yr,director,budget,gross
actor
:
id,name
铸造
:
movieid,actorid,ord
我有一个问题,我一直在问(列出所有1962年电影的电影以及主角)。[注:演员的ord字段给出了演员的位置。如果ord=1,则该演员是主演]
我的回答是:
select
title, name
from
movie
join
casting on movie.id = casting.movieid
join
actor on actor.id = casting.actorid
where
yr = 1962 and movie.id = casting.movieid and actor.id = casting.actorid and casting.ord = 1
group by
title
但我的问题是,我可以接近答案,我在ord部分有问题,因为有些演员没有1个演员,只显示了2个,所以它不会显示在输出上
我如何让它选择ord=1或ord=2(但不能同时选择两者)(并且1具有更高的优先级)
希望有人能帮我解决这个问题。将CROSS APPLY()与子查询一起使用,子查询按“ord”列排序,并有一个TOP(1)子句
希望这将输出您的预期结果
Select title,name
From Movie M
Cross Apply (Select top 1 movieid,actorid,ord from Casting Order By ord) as Cast
Inner join Actor A On A.id = Cast. actorid
我有两个答案:
SELECT movie.title, (select actor.name from actor where actor.id = casting.actorid)
FROM movie
JOIN casting
ON movie.id =casting.movieid
WHERE movie.yr = 1962 and casting.ord = 1
但后来我意识到你可以链接连接:
SELECT movie.title, actor.name
FROM movie
JOIN casting ON movie.id=casting.movieid
JOIN actor ON casting.actorid = actor.id
WHERE movie.yr = 1962 and casting.ord = 1
第二个显然要简单得多。(无需嵌套SELECT
语句)
要让它选择或,请执行。。。和(casting.ord=1或casting.ord=2)
。
要按1排序,请尝试类似于(1,2)中的
order by casting.ord。(我没有对此进行测试。作为补充说明,您在where
子句中重复了连接条件,这是不必要的。@oerkelens我实际上是在尝试将这3个表连接在一起。不是这样的方法?您的连接很好,但您不需要在where子句中再次使用相同的条件。(这只适用于隐式联接,在隐式联接中不使用联接条件。使用显式联接的方式更好。)
SELECT movie.title, (select actor.name from actor where actor.id = casting.actorid)
FROM movie
JOIN casting
ON movie.id =casting.movieid
WHERE movie.yr = 1962 and casting.ord = 1
SELECT movie.title, actor.name
FROM movie
JOIN casting ON movie.id=casting.movieid
JOIN actor ON casting.actorid = actor.id
WHERE movie.yr = 1962 and casting.ord = 1