我有一项任务是编写一个使用单个内连接和交叉连接的查询。我已经写过的应该返回相同结果的查询如下所示:
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
答案 0 :(得分: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
我更改了联接的顺序:因为movie
链接到show
中的字段,show
应该在movie
之前。