如何在一个查询中使用内连接和交叉连接?

Pat*_*ryk -3 sql join inner-join cross-join

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

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
Run Code Online (Sandbox Code Playgroud)

小智 6

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

当您想要连接每一行时,您应该使用交叉连接.使用它没有任何意义,然后在where子句中有条件指定哪些行应该匹配(正如您所做的那样).

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

这是一个修改后的查询,它使用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
Run Code Online (Sandbox Code Playgroud)

我改变了连接的顺序:因为movie链接到一个字段show,show应该在之前movie.