2013-09-03 2 views
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 в течение десяти минут, однако я не могу понять это из-за этой линии:Как написать этот SQL, чтобы сделать его легко понять

INNER JOIN 
     Area 
     INNER JOIN BusLine 

Интересно, если кто-нибудь может объяснить это и перераспределить его, чтобы сделать его понятным? Схема


обновление:

Площадь:

ID 
Name 

шинопровода:

ID 
AreaID --> ID in Area 
LineCode 

BusInfo:

ID 
BusLineID --> ID in BusLine 

Автовокзалы:

BusInfoID --> ID in BusInfo 

BTW, я использую Access, кажется, что я должен использовать (), чтобы обернуть innjer join.

+0

Вы должны указать свою схему, а затем только любой, кто мог бы объяснить – Tushar

ответ

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') 

EDIT: Я хотел бы добавить, вложенные внутреннее соединение синтаксиса это просто способ указать приоритет, то есть этот набор объединения должно быть (логически) выполняются перед другими , Некоторые SQL-модули поддерживают использование круглых скобок для этой цели. Там, где все соединения являются внутренними соединениями, нет логической разницы между вложенными и не вложенными формами (т. Е. Предоставленным вами SQL и альтернативным SQL I, приведенным выше).

+0

Ваши коды могут работать, можете ли вы рассказать мне о различии между ними? – hguser

+0

Нет логической разницы между два или, по крайней мере, не должно быть. – David

+0

Тогда в моем оригинальном посте можно вы говорите мне заказ на вступление? – hguser

1

Вещь, которая вас сбивает с толку, - это не тот раздел, который вы выделили. INNER JOIN Area соединяется сначала с частью выше, потому что следующая часть INNER JOIN BusLine ON Area.ID = BusLine.AreaID является обычным стандартным соединением с предложением.

IF (и это большой, если) я правильно прочитал этот запрос (автобусные линии, выходящие из Нью-Йорка с числом остановок они имеют), вот что я хотел бы попробовать, чтобы реорганизовать его

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 

Скажите, пожалуйста, если результат будет таким же!

+0

Я добавляю '(' в sql для запуска его в доступе, но он говорит мне, что есть синтаксические ошибки: http: //pastebin.com/ UqQ0YBHJ – hguser

+0

Ошибка синтаксиса где? Также в вашем запросе pastebin'd есть скобки, которые я не писал. Может быть, они несовместимы? –

+0

Я добавляю скобки, потому что я использую Access, кажется, что скобки нужны. – hguser

Смежные вопросы