【问题标题】:How to use inner join and cross join in one query?如何在一个查询中使用内连接和交叉连接?
【发布时间】:2013-04-16 15:42:05
【问题描述】:

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

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

【问题讨论】:

  • “我的任务是编写一个使用单个内部联接和交叉联接的查询” - 这是否意味着您已被告知要编写一个查询必须使用单个内部连接和交叉连接(可能作为学术练习),或者您需要编写查询并且认为它需要使用单个内部连接加入和交叉加入? (如果答案是后者,请参阅 dan111 的答案。)

标签: sql join inner-join cross-join


【解决方案1】:

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 之前。

【讨论】:

    猜你喜欢
    • 2012-12-31
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    相关资源
    最近更新 更多