-3

我的任务是编写一个使用单个内部联接和交叉联接的查询。我已经编写的应该返回相同结果的查询如下所示:

SELECT T.PRICE, S.ROW, S.NUMBER, M.TITLE  
FROM 
[cinema_no_keys].[dbo].[TICKET] T cross join 
[cinema_no_keys].[dbo].[MOVIE] M cross join 
[cinema_no_keys].[dbo].[SEAT] S cross join 
[cinema_no_keys].[dbo].[SHOW] SH
WHERE
T.ID_SEAT = S.ID_SEAT AND
M.ID_MOVIE = SH.ID_MOVIE AND
SH.DATE_HOUR = T.DATE_HOUR
4

1 回答 1

6

cross join是 的一个特例inner join:它是一个没有任何条件的内连接。换句话说,它连接了表的每一行。它存在的唯一原因是您不必编写像inner join TABLE on 1=1.

当你想加入每一行时,你应该只使用交叉连接。使用它然后在where子句中有条件指定哪些行应该匹配(就像你正在做的那样)是没有意义的。

正确的做法是使用, 并在子句而不是子句inner join中指定连接条件。这为您的查询提供了更多的逻辑流程,并且在许多情况下它也会更有效(您越早从结果中排除行,您的查询运行得越快)。onwhere

这是一个修改后的查询,它使用inner join

select T.PRICE, S.ROW, S.NUMBER, M.TITLE  
    from [cinema_no_keys].[dbo].[TICKET] T 
    inner join [cinema_no_keys].[dbo].[SEAT] S on
        T.ID_SEAT = S.ID_SEAT
    inner join [cinema_no_keys].[dbo].[SHOW] SH on
        SH.DATE_HOUR = T.DATE_HOUR
    inner join [cinema_no_keys].[dbo].[MOVIE] M on
        M.ID_MOVIE = SH.ID_MOVIE

我更改了连接的顺序:因为movie指向 , 中字段的链接show应该showmovie.

于 2013-04-23T12:20:53.197 回答