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.
| 归档时间: |
|
| 查看次数: |
4006 次 |
| 最近记录: |