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

时间:2013-04-23 12:15:24

标签: 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

1 个答案:

答案 0 :(得分:6)

cross joininner 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

我更改了联接的顺序:因为movie链接到show中的字段,show应该在movie之前。