Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联接表中的选定语句_Sql_Sql Server - Fatal编程技术网

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