0
SELECT  BusLine.LineCode AS RouteID,
  BusStation.Station AS StartStation, BusStation_1.Station AS EndStation,
  BusStation_1.StationIndex - BusStation.StationIndex AS StopCount
FROM  BusLine AS BusLine_1 
    INNER JOIN Area AS Area_1 
        ON BusLine_1.AreaID = Area_1.ID 
    INNER JOIN BusInfo AS BusInfo_1 
        ON BusLine_1.ID = BusInfo_1.BusLineID 
    INNER JOIN BusStation AS BusStation_1 
        ON BusInfo_1.ID = BusStation_1.BusInfoID 
    INNER JOIN 
        Area 
        INNER JOIN BusLine 
            ON Area.ID = BusLine.AreaID 
        INNER JOIN BusInfo 
            ON BusLine.ID = BusInfo.BusLineID 
        INNER JOIN BusStation 
            ON BusInfo.ID = BusStation.BusInfoID
        ON BusStation_1.StationIndex > BusStation.StationIndex AND   BusInfo_1.ID = BusInfo.ID
WHERE  (Area.City = 'NewYork') 

我已经阅读了上面的 sql 十分钟,但是由于这一行,我无法理解:

    INNER JOIN 
        Area 
        INNER JOIN BusLine 

我想知道是否有人可以解释它并重新考虑它以使其易于理解?


更新架构:

区域:

ID
Name

公交线路:

ID
AreaID --> ID in Area
LineCode

公交信息:

ID
BusLineID --> ID in BusLine

公车站:

BusInfoID --> ID in BusInfo 

顺便说一句,我正在使用 Access,看来我必须( )使用innjer join.

4

2 回答 2

2

原作者已经足够体贴地以一种指示连接在逻辑上相关的方式缩进 SQL。

它可以重写为:

FROM  BusLine AS BusLine_1 
    INNER JOIN Area AS Area_1 
        ON BusLine_1.AreaID = Area_1.ID 
    INNER JOIN BusInfo AS BusInfo_1 
        ON BusLine_1.ID = BusInfo_1.BusLineID 
    INNER JOIN BusStation AS BusStation_1 
        ON BusInfo_1.ID = BusStation_1.BusInfoID 
    INNER JOIN BusStation 
        ON BusStation_1.StationIndex > BusStation.StationIndex
    INNER JOIN BusInfo 
        ON BusInfo.ID = BusStation.BusInfoID AND BusInfo_1.ID = BusInfo.ID
    INNER JOIN BusLine 
        ON BusLine.ID = BusInfo.BusLineID 
    INNER JOIN Area 
        ON Area.ID = BusLine.AreaID 
WHERE  (Area.City = 'NewYork') 

编辑:我应该补充一点,嵌套的内部连接语法只是一种指示优先级的方法,即这组连接应该(逻辑上)在其他连接之前执行。一些 SQL 引擎支持为此使用括号。在所有连接都是内部连接的情况下,嵌套和非嵌套形式之间没有逻辑差异(即您提供的 SQL 和我在上面提供的替代 SQL)。

于 2013-09-03T10:05:40.720 回答
1

让您感到困惑的并不完全是您突出显示的部分。INNER JOIN Area首先与上面的部分连接,因为下面的部分INNER JOIN BusLine ON Area.ID = BusLine.AreaID是带有子句的常规标准连接。

如果(这是一个很大的如果)我已经正确阅读了这个查询(离开纽约的公交线路及其停靠站的数量),这就是我要尝试重构的内容

SELECT  BusLine.LineCode AS RouteID,
  BusStation.Station AS StartStation, BusStation_1.Station AS EndStation,
  BusStation_1.StationIndex - BusStation.StationIndex AS StopCount
FROM  BusLine AS BusLine_1 
    INNER JOIN Area AS Area_1 
        ON BusLine_1.AreaID = Area_1.ID 
    INNER JOIN BusInfo AS BusInfo_1 
        ON BusLine_1.ID = BusInfo_1.BusLineID 
    INNER JOIN BusStation AS BusStation_1 
        ON BusInfo_1.ID = BusStation_1.BusInfoID 
    INNER JOIN Area 
        ON BusStation_1.StationIndex > BusStation.StationIndex AND   BusInfo_1.ID = BusInfo.ID AND Area.City = 'NewYork'
    INNER JOIN BusLine 
        ON Area.ID = BusLine.AreaID 
    INNER JOIN BusInfo 
        ON BusLine.ID = BusInfo.BusLineID 
    INNER JOIN BusStation 
        ON BusInfo.ID = BusStation.BusInfoID

请告诉我结果集是否相同!

于 2013-09-03T09:54:49.370 回答