2014-01-31 2 views
0

У меня есть запрос в sqlserver, который нужно перевести на sqlite3, но этот запрос использует «Right external join», проблема в том, что sqlite еще не поддерживает этот оператор.Right Outer Join to Left Outer join

Как я могу перевести этот запрос, чтобы использовать только «левое внешнее соединение» вместо «правого» внешнего соединения?

SELECT * 
FROM P RIGHT OUTER JOIN 
     CL RIGHT OUTER JOIN 
     C LEFT OUTER JOIN 
     CC ON C.IDC = CC.RIDC ON 
     C.IDC = C.RIDCL ON P.IDP = C.RIDP 

Спасибо.

PS: У меня возникли проблемы с тем, что sqlite соединяется с приоритетом и ассоциативностью, не знаю, как это может изменить конечный результат, переупорядочив таблицы.

+0

Аналогичный вопрос http://stackoverflow.com/questions/9147025/sqlite3-simulate-right-outer-join-with-left-joins-and-union – Leo

ответ

2

В этом вопросе таблица c находится посередине. Так что это запрос.

Ваши on Условия находятся в незнакомых местах. Я предполагаю, что это то, что вы имеете в виду:

SELECT * 
FROM C LEFT OUTER JOIN 
     CC 
     ON C.IDC = CC.RIDC LEFT OUTER JOIN 
     P 
     ON P.IDP = C.RIDP LEFT OUTER JOIN 
     CL 
     ON CL.IDC = C.RIDCL 
+0

Что вы подразумеваете под «вождением запроса», находясь посредине? – danielrvt

+1

Если вы нарисовали диаграмму запроса. Рисуя стрелки из таблиц, чтобы показать «изящество» объединений. Стол «C» будет посередине со всеми стрелками, указывающими на него. – jerrylagrou

+0

Wow thanks !!! что мне очень помогло !!! – danielrvt

1

Дополнительное замечание о синтаксисе соединения.

Большинство людей пишут

Tab1 JOIN Tab2 ON ... JOIN Tab3 ON ... JOIN Tab4 ON ... 

вероятно потому, что это «естественный» путь, один стол после того, как другой.

Но ваши соединения используют «другой» синтаксис, который я обычно стараюсь избегать.

Tab1 JOIN Tab2 JOIN Tab3 JOIN Tab4 ON ... ON ... ON ... 

Логически присоединяется обрабатывается в порядке ON, так что добавление Паренса результатов в:

(P 
    RIGHT OUTER JOIN 
    (CL 
    RIGHT OUTER JOIN 
     (C 
     LEFT OUTER JOIN 
     CC 
     ON C.IDC = CC.RIDC 
    ) p 
    ON C.IDC = C.RIDCL 
    ) 
    ON P.IDP = C.RIDP 
) 

Перезаписи это приводит к порядка соединение С-CC-CL-P. Это не C-CC-P-CL, который используется Гордоном, но в вашем случае это не имеет значения, потому что C является основной таблицей :-)